加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp-classic – 使用ADO Stream逐行读取大文件?

发布时间:2020-12-16 03:34:37 所属栏目:asp.Net 来源:网络整理
导读:我想使用ADO Stream从UTF-8编码的本地大文本文件中读取行,所以我试试 Set objStream = CreateObject("ADODB.Stream")objStream.Charset = "utf-8"objStream.Type = 2objStream.OpenobjStream.LoadFromFile = strFileobjStream.LineSeparator = 10Do Until ob
我想使用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

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

解决方法

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

至于读取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!

[编辑]那么,对于.LineSeparator你只能使用3个常数:

Constant Value Description

adCRLF   -1    Default. Carriage return line feed 
adLF     10    Line feed only 
adCR     13    Carriage return only

如果你需要在其他字母上打破Do..Loop,因为.ReadText是读取文本流的唯一选择,你可以将它与InStr函数一起使用,然后退出,然后找到你的自定义分隔符.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读