回 帖 发 新 帖 刷新版面

主题:[讨论]如何读取超大文本文件


我公司现在要使用超大的文本文件进行业务处理,有近10M大小,超过17万行,原来写的小程序由于数组的原因已不能读取了。现在请问高手  1.如何才能读取超过17万行的文本文件,2.如何把它每2000个分成1个小文本文件.谢谢

回复列表 (共7个回复)

沙发

看来所谓的行,就是记录。
数组的上限似乎可以大于17万。
可不一定全部读入,打开文件后,按记录要求只读入游泳的,就简单多了。
还可以考虑,使用ado技术,把文本文件作为数据库处理。

分割文件,在我看来是“得不偿失”的做法。

板凳


是每一行都有用的,要拿其它文本文件和这个文件中的每一行的每一小节进行比较。

分割成2000行的多个小文件也是有用的,用于提交工商银行的网上指令用。

3 楼

我处理过120多M的文本,建议用fso
不然的话,就用字节数组,不过要精确计算。10m完全可以一次载入内存。

4 楼

1、用普通文件读取,读一句对比一句,或者是读取到需要的值(也就是查找),再来对比,不用全部加载到内存中(即是用变量读出来);
2、读入到数据库中,再进行相应的处理。建议用ADODC和Datagrid控件,不推荐用MSFlexgrid和MSHFlexgrid控件,Datagrid控件只会加载当前记录以及前后少量记录,需要的时候才会动态读取,就算你有100万行对内存也影响不大。

楼主最好稍微详细点说明一下数据的组成及如何对比(处理),可能更易找到解决之道。

5 楼

可以先把行数和偏移记录在一个文件里,需要时再读取。

6 楼

可以偿试当数据库来读,数据库引擎不会一次将所有记录在入内存,而是根据需要来进行磁盘交换:

    Dim cn As ADODB.Connection, rs As ADODB.Recordset
    Set cn = New ADODB.Connection
    
    '打开连接,只要指定文本文件所在目录
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" _
        & "Data Source=c:\txttest\;" _
        & "Extended Properties= ""text;HDR=No;FMT=Delimited """
        
    '打开记录集
    Set rs = New ADODB.Recordset
    rs.CursorLocation = adUseClient        '这个必须是客户端游标,不然AbsolutePosition属性不可用
    rs.Open "SELECT * FROM [t.txt]", cn    '指定文本文件名称

    '定位到第20000行
    rs.AbsolutePosition = 20000
    Debug.Print rs.Fields(0)
    
    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing

如果用rs.movenext来循环读取数据,这样你可以很简单的将文件分隔成20000行的小文件。用这种方法可以注释掉rs.CursorLocation = adUseClient,这样默认是服务器端游标,性能应该会更好点。

7 楼


首先感谢楼上的各位兄弟的解答!

如下面的aa.txt 文件记录
asdfas|adfasdfasdflkjl|asdfasfas|ffffff|dssssdsd|
asdfasdfafaf|ssdfsdf|qerqwer|adsfasfasdffds|asdfasf|
。。。
。。。

bb.txt 文件记录类似于aa.txt 文件,都是用 “|”分隔,
要查找bb文件中的每一行中的第4小节等于aa文件中的第3小节,若找到等于,把bb的第2小节内容替换成aa的第2小节内容,否则不修改bb的某一行内容,继续进行下一行的查找替换。
谢谢

我来回复

您尚未登录,请登录后再回复。点此登录或注册