如何快速读取含有非法字符文本文件的一行,该文件通常比较大。

时间:2023-02-11 09:17:06
如果打开一个文本文件,里面有非可显字符,如00H,1AH等,用什么读一行比较快?我试过用Line Input发现读出的结果里可以有00H但判断1AH为EOF,而用二进制方式打开速度太慢,用FSO(File System Object)倒是可以越过1AH,但在有00H的情况下,有时居然可以前后读出来,而中间部分全为00H,目前唯一测出用FSO的Read(1)速度还相对快些,也正确,只是仍觉得有些慢,不知各位有没有什么好办法可以用的。想用API但不知道用哪个。因为要读的文件很大,如果一个字符一个字符地读,无论什么打开方式都很慢,而用文本方式打开,然后按行读Line Input最快,FSO的readline和它差不多,稍慢些,速度都比按字符读要快得多。按行读138M的文件大约用了4分钟左右,而按字符读却用了30-60分钟。谁有好方法提供一下。

5 个解决方案

#1


是你不知道用二进制文件
用二进制文件比其他方法快哪里去了



把文本文件内容读取TextBox:
Dim TempFile As Long
Dim LoadBytes() As Byte

TempFile=FreeFile
Open 文件名 For Binary As #TempFile
Redim LoadBytes(1 To Lof(TempFile)) As Byte
Get #TempFile,,LoadBytes
Close TempFile

Text1.Text=StrConv(LoadBytes,vbUniCode)

#2


我觉得也可能是因为缓冲区的问题,不过因为一行的长度不固定,我不好设定缓冲区,你说的方法文件小可以,但要把几十兆甚至上百兆的东西都读入内存,这样开销会很大,而且我的操作主要是基于行处理的,都读入的话处理起来也不太方便。另外textbox的限制是32K,而如果用richtext是不是有点罗嗦了?

#3


一次读取一定大小(比如1K)
再查找换行符,合并字符串

#4


zyl910(910:分儿,我来了!):

  能不能说详细点,我也想知道。

#5


谢谢,试过了读一段内容放入缓冲区,再用split拆出行来,可我感觉我缓冲区设为1024和2048速度没区别啊?是不是缓冲区再大也不见得能再提高多大的效率了?速度倒是和line input相近了,可还是有些慢,不过不大。

#1


是你不知道用二进制文件
用二进制文件比其他方法快哪里去了



把文本文件内容读取TextBox:
Dim TempFile As Long
Dim LoadBytes() As Byte

TempFile=FreeFile
Open 文件名 For Binary As #TempFile
Redim LoadBytes(1 To Lof(TempFile)) As Byte
Get #TempFile,,LoadBytes
Close TempFile

Text1.Text=StrConv(LoadBytes,vbUniCode)

#2


我觉得也可能是因为缓冲区的问题,不过因为一行的长度不固定,我不好设定缓冲区,你说的方法文件小可以,但要把几十兆甚至上百兆的东西都读入内存,这样开销会很大,而且我的操作主要是基于行处理的,都读入的话处理起来也不太方便。另外textbox的限制是32K,而如果用richtext是不是有点罗嗦了?

#3


一次读取一定大小(比如1K)
再查找换行符,合并字符串

#4


zyl910(910:分儿,我来了!):

  能不能说详细点,我也想知道。

#5


谢谢,试过了读一段内容放入缓冲区,再用split拆出行来,可我感觉我缓冲区设为1024和2048速度没区别啊?是不是缓冲区再大也不见得能再提高多大的效率了?速度倒是和line input相近了,可还是有些慢,不过不大。