主题:[讨论]如何读取超大文本文件
笔头风月
[专家分:0] 发布于 2008-01-13 11:45:00
我公司现在要使用超大的文本文件进行业务处理,有近10M大小,超过17万行,原来写的小程序由于数组的原因已不能读取了。现在请问高手 1.如何才能读取超过17万行的文本文件,2.如何把它每2000个分成1个小文本文件.谢谢
回复列表 (共7个回复)
沙发
老大徒伤悲 [专家分:29120] 发布于 2008-01-13 12:08:00
看来所谓的行,就是记录。
数组的上限似乎可以大于17万。
可不一定全部读入,打开文件后,按记录要求只读入游泳的,就简单多了。
还可以考虑,使用ado技术,把文本文件作为数据库处理。
分割文件,在我看来是“得不偿失”的做法。
板凳
笔头风月 [专家分:0] 发布于 2008-01-13 15:54:00
是每一行都有用的,要拿其它文本文件和这个文件中的每一行的每一小节进行比较。
分割成2000行的多个小文件也是有用的,用于提交工商银行的网上指令用。
3 楼
brokenworld [专家分:2640] 发布于 2008-01-13 16:59:00
我处理过120多M的文本,建议用fso
不然的话,就用字节数组,不过要精确计算。10m完全可以一次载入内存。
4 楼
华山论剑 [专家分:5310] 发布于 2008-01-14 08:50:00
1、用普通文件读取,读一句对比一句,或者是读取到需要的值(也就是查找),再来对比,不用全部加载到内存中(即是用变量读出来);
2、读入到数据库中,再进行相应的处理。建议用ADODC和Datagrid控件,不推荐用MSFlexgrid和MSHFlexgrid控件,Datagrid控件只会加载当前记录以及前后少量记录,需要的时候才会动态读取,就算你有100万行对内存也影响不大。
楼主最好稍微详细点说明一下数据的组成及如何对比(处理),可能更易找到解决之道。
5 楼
bcahzvip [专家分:6040] 发布于 2008-01-14 10:56:00
可以先把行数和偏移记录在一个文件里,需要时再读取。
6 楼
家人 [专家分:6760] 发布于 2008-01-14 13:12:00
可以偿试当数据库来读,数据库引擎不会一次将所有记录在入内存,而是根据需要来进行磁盘交换:
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 楼
笔头风月 [专家分:0] 发布于 2008-01-14 16:53:00
首先感谢楼上的各位兄弟的解答!
如下面的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的某一行内容,继续进行下一行的查找替换。
谢谢
我来回复