我的程序大致过程是这样的:
1.打开一个文章列表的网页,逐个读出标题,再用每个标题在标题库TitleFile里用instr函数查找,当返回0,则认为此标题是新标题,并在 TitleFile 后追加此标题,添加方式是 TitleFile = TitleFile & vbCrLf & Title(iTeam);
2.当返回大于0,则认为是重复标题,则不添加。问题:函数常常不能准确的判断是否重复,明明已经重复了,但是instr依然返回0,请问问题有可能出在哪里?如果我这个方案不可行,是否有更科学的办法。
补充:由于数据量比较大,TitleFile字符串比较长,大约几千行标题,保存成txt文件也有50kb以上。大致代码如下:
If InStr(TitleFile, Title(iTeam)) > 0 Then
(重复标题的处理...)
Else
TitleFile = TitleFile & vbCrLf & Title(iTeam)
End If
1.打开一个文章列表的网页,逐个读出标题,再用每个标题在标题库TitleFile里用instr函数查找,当返回0,则认为此标题是新标题,并在 TitleFile 后追加此标题,添加方式是 TitleFile = TitleFile & vbCrLf & Title(iTeam);
2.当返回大于0,则认为是重复标题,则不添加。问题:函数常常不能准确的判断是否重复,明明已经重复了,但是instr依然返回0,请问问题有可能出在哪里?如果我这个方案不可行,是否有更科学的办法。
补充:由于数据量比较大,TitleFile字符串比较长,大约几千行标题,保存成txt文件也有50kb以上。大致代码如下:
If InStr(TitleFile, Title(iTeam)) > 0 Then
(重复标题的处理...)
Else
TitleFile = TitleFile & vbCrLf & Title(iTeam)
End If
Dim TitleFile As StringPrivate Sub Command1_Click()
Dim i As Long
Dim j As Long
Dim MaxItem As Long
Dim s As String
Dim Temp() As String
Dim MaxNew As Long
MaxItem = UBound(Title)
ReDim Temp(MaxItem)
Temp(0) = Trim(Title(0))
For i = 1 To MaxItem
s = Trim(Title(i))
If s <> "" Then
For j = 0 To MaxNew
If s = Trim(Title(j)) Then
GoTo Found
End If
Next
MaxNew = MaxNew + 1
Temp(MaxNew) = s
End If
Found:
Next
ReDim Preserve Temp(MaxNew)
TitleFile = Join(Temp, vbCrLf)
End Sub
别把问题想成是程序函数的问题,多想想你自己的问题。
这种基本的函数不要去怀疑
看看是不是字符串里面包含了全角空格之类的字符,这个用trim去不掉的。
所以你把认为有问题的变量仔细检查下。比如空格啊,全角空格啊半角空格啊,以及连续空格在html中是表示为 的,这些只有单步调试了,而不是肉眼简单一看就说诊断是instr的问题。你的代码基本也是不完善的,打个比方,有这么几行abc、ab,而你获得了一个新的标题为a,那么会被检测为存在。修改如下:
If InStr(vbcrlf & TitleFile,vbcrlf & Title(iTeam) & vbcrlf ) > 0 Then'加上前后的回车符这样就避免了字符串相包含的问题
(重复标题的处理...)
Else
TitleFile = TitleFile & vbCrLf & Title(iTeam)
End If
是一种非常低效的操作,因为VB的文本链接 & 操作 比如 a=b & c 时,需要计算出b,c的长度,然后分配一块容纳lenb(b)+lenb(c)的内存a,再将b拷贝到a、c拷贝到a,单独一个&效率没有什么大不了,但是,当使用循环进行连接,那么,拷贝的消耗完全超出你的想象!
同时,instr需要在对源字符串逐个对齐进行比较,相对于数组比较(开头字符对齐比较),又是一个低效的操作; 因此,2L给你的代码应该是一个比较有效率的操作方式!