VB如何高效的查找Textbox中包含指定字符串所在的行数

ytsunwj 2008-05-27 10:34:13
假设Textbox1已包含几万行数据,我要从第100行以后查找G00Z100.这个关键字直到末尾,如何能快速计算出其所在的行数?找到第一个即可,不需要循环查找。关键是要快速,高效。
看过别人的答案:http://zhidao.baidu.com/question/17173499.html?fr=qrl,我试了一下,的确是可行的,缺点就是太慢,让人无法忍受。所以我在此请教各位,请高手们不吝赐教,小弟感激不尽!
...全文
454 点赞 收藏 14
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
lxylq1 2008-06-16
哎,,,,你们这样对于TextBox 到行,如果换了 RichTextBox 一样慢死人。。。。

RichTextBox 可存在 N 多M字节的文本,你这速度不知道如何...??

难道先将 RichTextbox.TExt保存为文件?再读出来??。。。更慢了。。。。

我在处理1M以下的查找替换到无所谓,当大于2M时,调用 RichTextBox.Text 属性,哪才叫决 —— 好慢啊。!!
回复
yo000000yo 2008-05-27
嗯,lz真笨
回复
ytsunwj 2008-05-27
[Quote=引用 5 楼 SupermanKing 的回复:]
“假设Textbox1已包含几万行数据”?
object.Text [= string]
String 数据类型
定长字符串可包含 1 到大约 64K ( 2^16 ) 个字符。

就是说TextBox有64K的限制哟。

65536 byte = 64 kb

65536 / 10000 = 6.5536 个字节/每行(不算换行符)

换行符 = 2 byte
2 byte * 10000 个行 = 20000 个字节了
65536 - 20000 = 45536 个字节
45536 / 10000 = 4.5536

就10000行你每行就 4到5个英文字,几万行你每行…
[/Quote]

谢谢你了,你的方法不错。jennyvenus 的方法也很好,不用读入文本框,可以省不少时间
是我太笨,没想通。呵呵,这样就可以了

Dim s As String
Open "E:\tl-work\新建文件夹\R1201F02.nc" For Input As #1
N = 1
Do

Line Input #1, s
If InStr(1, s, "Z100.") And N > 100 Then
MsgBox "发现了:在第" & N & "行"
Exit Do
Else: N = N + 1
End If
Loop While Not EOF(1)
Close #1



回复
“假设Textbox1已包含几万行数据”?
object.Text [= string]
String 数据类型
定长字符串可包含 1 到大约 64K ( 2^16 ) 个字符。

就是说TextBox有64K的限制哟。

65536 byte = 64 kb

65536 / 10000 = 6.5536 个字节/每行(不算换行符)

换行符 = 2 byte
2 byte * 10000 个行 = 20000 个字节了
65536 - 20000 = 45536 个字节
45536 / 10000 = 4.5536

就10000行你每行就 4到5个英文字,几万行你每行多少个字?

玩玩数学题,呵呵,不要介意。

按这么个说法多半你的TextBox行数不会上万,最多不就几千行,速度不会慢的
VB处理字符串这么点速度还是有的
如果要从一百行开始,这样做
因为你没有提及文件,我就不说文件了,单对TextBox说

Private Sub Command1_Click()
Dim StrA() As String
Dim X As Long
Dim keyText As String
'这里是要搜索的字符串
keyText = "12345"
'把Text1.Text的内容以换行为标志分割为字符串数组,每个数组元素就等于一行
StrA = Split(Text1.Text, vbCrLf)
'循环所有的行查询,起始行是100行开始,因为数组 StrA(0) 也是一行
For X = 99 To UBound(StrA)
If InStr(1, StrA(X), keyText) <> 0 Then
MsgBox "关键字找到在" & X + 1 & "行"
End If
Next X
End Sub
回复
ytsunwj 2008-05-27
呵呵,知道如何计算行数了,
Dim s As String
Open "E:\tl-work\新建文件夹\R1201F02.nc" For Input As #1
n = 1
Do

Line Input #1, s
If InStr(1, s, "G00Z100.") Then
MsgBox "发现了:在第" & n & "行"
Exit Do
Else: n = n + 1
End If
Loop While Not EOF(1)
Close #1

可是从第100行以后读入,代码又如何实现呢?
回复
ytsunwj 2008-05-27
谢谢,可是这样如何能得知所在的行数呢?而且要从第100行以后读入,代码又如何实现呢?
不好意思,我刚学VB,很多地方理解不了
回复
line input 进来,instr判断是最简单的。根据俺的经验,速度并不慢。

dim s as string
open "a.txt" for input as #1
do
line input #1,s
if instr( 1, s, "11223344" ) then
debug.pring "发现了"
exit do
endif
loop while not eof(1)
close #1
回复
line input 进来,instr判断是最简单的。

回复
QiaoDaLi 2008-05-27
学习了,jennyvenus 正解
回复
hq_chen 2008-05-27
jennyvenus 正解
回复
最终行数要加1
Open "E:\tl-work\新建文件夹\R1201F02.nc" For Input As #1
Dim str1 As String, fstr2, nline As Long
str1 = Input(LOF(1), 1)
fstr2 = "ffd2"
nline = InStr(str1, fstr2)
Debug.Print "字符串所在行:" , nline - Len(Replace(Left(str1, nline), vbCrLf, " "))+1
回复
一次性读入判断应该会快一点的吧 假如你文件不是太大
Open "E:\tl-work\新建文件夹\R1201F02.nc" For Input As #1
Dim str1 As String, fstr2, nline As Long
str1 = Input(LOF(1), 1)
fstr2 = "ffd2"
nline = InStr(str1, fstr2)
Debug.Print "字符串所在行:" , nline - Len(Replace(Left(str1, nline), vbCrLf, " "))
回复
思路先行,呵呵~~

顶顶.
回复
n=n+1应该是无条件执行的。

Dim s As String
Open "E:\tl-work\新建文件夹\R1201F02.nc" For Input As #1
N = 1
Do

Line Input #1, s
If InStr(1, s, "Z100.") And N > 100 Then
MsgBox "发现了:在第" & N & "行"
Exit Do
End If
N = N + 1
Loop While Not EOF(1)
Close #1
回复
相关推荐
发帖
VB基础类
创建于2007-09-28

7518

社区成员

VB 基础类
申请成为版主
帖子事件
创建了帖子
2008-05-27 10:34
社区公告
暂无公告