使用ADO Stream逐行读取大文件?

Tei*_*eiv 5 vbscript ado asp-classic

我想使用ADO Stream从UTF-8编码的本地大文本文件中读取行,所以我试试

Set objStream = CreateObject("ADODB.Stream")
objStream.Charset = "utf-8"
objStream.Type = 2
objStream.Open
objStream.LoadFromFile = strFile
objStream.LineSeparator = 10
Do Until objStream.EOS
    strLine = objStream.ReadText(-2)
Loop
Run Code Online (Sandbox Code Playgroud)

但结果是脚本需要大量的RAM和CPU使用.那么有没有办法告诉脚本不要将所有文件内容加载到内存中,只是打开它并读取,直到它遇到任何行分隔符?

Pan*_*lov 8

当您使用Stream对象时,我认为显而易见的是,.LoadFromFile使用整个文件内容填充当前流,并且没有任何cutomize选项来从文件加载部分数据.

至于阅读1行,你已经用.ReadText(-2)(-2 = adReadLine)完成了这一步.

Set objStream = CreateObject("ADODB.Stream")
objStream.Charset = "utf-8"
objStream.Type = 2
objStream.Open
'objStream.LoadFromFile = strFile ''I see a typo here
objStream.LoadFromFile strFile
objStream.LineSeparator = 10      ''that's Ok
'Do Until objStream.EOS           ''no need this
    strLine = objStream.ReadText(-2)
'Loop
objStream.Close ''add this though!
Run Code Online (Sandbox Code Playgroud)

[ 编辑 ]好吧,对于.LineSeparator,您只能使用3个常量:

Constant Value Description

adCRLF   -1    Default. Carriage return line feed 
adLF     10    Line feed only 
adCR     13    Carriage return only 
Run Code Online (Sandbox Code Playgroud)

如果您需要打破Do..Loop其他字母,这.ReadText是阅读文本流的唯一选择,您可以将它与InStr函数结合使用,Exit Do然后找到自定义分隔符.

Const cSeparator = "_" 'your custom separator
Dim strLine, strTotal, index
Do Until objStream.EOS
    strLine = objStream.ReadText(-2)
    index = InStr(1, strLine, cSeparator)
    If index <> 0 Then
        strTotal = strTotal & Left(strLine, index-1)
        Exit Do
    Else
        strTotal = strTotal & strLine
    End If
Loop
Run Code Online (Sandbox Code Playgroud)

不久,这是你可以做的整个优化(或者至少据我所知).