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使用.那么有没有办法告诉脚本不要将所有文件内容加载到内存中,只是打开它并读取,直到它遇到任何行分隔符?
当您使用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)
不久,这是你可以做的整个优化(或者至少据我所知).
| 归档时间: |
|
| 查看次数: |
26104 次 |
| 最近记录: |