标题:如何对1.7G左右的TXT文件进行快速读写处理?
只看楼主
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:325
专家分:114
注 册:2010-2-17
结帖率:69.81%
已结贴  问题点数:20 回复次数:7 
如何对1.7G左右的TXT文件进行快速读写处理?
我对文本文件一般读入的方式都是将这个文本文件一次性读入内存,然后逐行读出,
读入的语句如下:
(模块:)
程序代码:
Public hpl() As String
Public hpl_count As Long
Public Sub read_to_array(ByVal filename As String)
ReDim hpl(1 To 1)
hpl_count = 1
fn = FreeFile
Open filename For Input As #fn
Do While Not EOF(fn)
Line Input #fn, lk
hpl(hpl_count) = lk
hpl_count = hpl_count + 1
ReDim Preserve hpl(1 To hpl_count)
Loop
hpl_count = hpl_count - 1
ReDim Preserve hpl(1 To hpl_count)
Close #fn
End Sub

(程序引用:)
Private Sub Command1_Click()
read_to_array "C:\AAA.txt"
End Sub


逐行读出的语句如下:
程序代码:
Private Sub Command1_Click()
Open "c:\1.txt" For Append As #1
For i = 1 To hpl_count
Print #1, hpl(i)
Next i
End Sub


现在遇见了一个超级大的TXT文件,1.7G左右大小,不能保证以后还会遇到更大的TXT文件,用上述语句读入就会内存溢出,不知道这么大的文件怎么进行保证速度的情况下进行读写操作?请路过的大神和高手不吝赐教一下。

或者,我想能不能把这个文件能够进行分割,我尝试了一下,我的工作电脑是2G内存,安装了win7系统,在通过使用上述语句的情况下,400M左右的文本可以正常读取。

由于这个TXT文件内部是一段一段的数据,每一段数据是一个整体,行数不定,我看到网上的文件分割语句都是指定行数分割,比如每1000行分割成一个文件,这样的话就会将我的这个巨大文本里的一个个的小整体破坏完整性,不知道如何将巨大文本里的一个个的小整体按照小整体的格式进行指定生成文件的大小进行分割(例如每个小整体都是从包含“Site1 PartID: "”字符串行开始,到包含“Device PartID: "”字符串行结束,由于我的工作电脑用上面的语句可以正常读写400M的文件,所以我想能不能有一个分割程序,在读了几个完整的小整体段数据后,差不多400M了,就进行分割,然后再读了几个完整的小整体段数据后,差不多400M了,再进行分割,以此类推按照这个文件1.7G大小,差不多分割成5个文件,前4个都是400M左右,最后一个100M左右,首先要保证的是每个文件中都是完整的小段数据)。
这个想法,也请路过的大神和高手不吝赐教。

然后咨询一个旁的问题,我用上面的语句进行读写后,电脑会变得非常的卡,是不是需要在程序运行完后,进行一下对内存的释放?这个语句该怎么写呢?

下方附,巨大文本文件压缩包,压缩后5M左右,释放后大约1.7G。
N-LPY-D_20210114.rar (4.79 MB)


搜索更多相关主题的帖子: TXT 左右 文件 语句 分割 
2021-04-20 00:35
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:20 
如果是切割,那就不如完全切割,按你的段进行切割,分别保存为文件放一个临时目录。
如果需要查找 PartID 的话,文件名以序号+PartID命名。
如第一个:就写成 0001-P507123.txt
------------------
同时生成一个目录文件,按行写入文件名。
程序处理时,先读,是否有目录文件,有,读目录文件,根据目录文件,判断所有的文件是否存在。如果有不存的,或目录不存的,切割文件。
处理时,使用循环按目录顺序分别打开每个文件,然后处理。
查找时,到目录里查找partid,然后打开对应的文件进行处理。





授人于鱼,不如授人于渔
早已停用QQ了
2021-04-20 11:06
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:325
专家分:114
注 册:2010-2-17
得分:0 
完全理解您的意思,按照边读边写的方式生成一个个的小文件。但我想的是,这种方法是最基础的文本文件读写方式,效率和速度是最低的,有没有更快的方式方法呢?
2021-04-20 11:47
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4912
专家分:29900
注 册:2008-10-15
得分:0 
那只能你评估每个段的预计大小,如每个段平均是50M的话,
读一行写一行,同时统计文件大小,达到一定大小,到了段结束,则换一个文件
如你一次可以处理400M大小的文件,那么写临时文件,写完了一个段后,判断一下文件大小,如果达到了350M,那么就换一个文件写。


授人于鱼,不如授人于渔
早已停用QQ了
2021-04-20 18:30
ictest
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:325
专家分:114
注 册:2010-2-17
得分:0 
尊敬的 风吹过b 大大:
    经过几天的对您给出的语句的进行分析以及对网上数据库语句的学习,恕我驽钝,对数据库的深入操作的学习,还是走进了死胡同,两眼一抹黑,实在是不能把您给出的提示融入到我的程序中,现将我的程序奉上,麻烦您给出一段可执行的完整语句,添加到我的程序中,跪谢中。
    另外,关于我的前一个帖子《如何对1.7G左右的TXT文件进行快速读写处理?》还是按照您提议的方法:将文件进行按段进行切割,分别保存为一个一个的文件,放一个临时目录,然后经处理后读入数据库(本程序中的数据库就是按照这个方法生成的),文本文件大了,慢是比较慢,但是能够处理1.7G以上的TXT文件,不会死机。但是又出现了新问题,读入这个较大的文本文件到数据库中后,行数达到的500万行以上,已经远远超出“Excel2007及以后的版本最大行数是1048576行”的限制,我的程序中“导出到EXCEL文件”功能按钮就无法正常使用了,这个问题怎么解决呢?也想请您给出一个解决方法。
    在这里先非常感谢您的无私帮助。
数据库表.rar (76.61 KB)
2021-04-24 18:51
旺仔牛奶opo
Rank: 2
等 级:论坛游民
帖 子:2
专家分:20
注 册:2021-4-25
得分:0 
可以使用matalab读取,我读过3G的
2021-04-25 17:49
zbjzbj
Rank: 12Rank: 12Rank: 12
来 自:郑州
等 级:贵宾
威 望:52
帖 子:620
专家分:3020
注 册:2011-4-22
得分:0 
很佩服楼主:“我的工作电脑是2G内存,安装了win7系统”都这个时代了,还蚂蚁啃骨头。
txt文件一样保存数据,为什么非要读到excel?就是读到excel,查询检索不慢吗?
给楼主个建议:
1.请楼主建议ms扩展excel
2.改用c语言,升级电脑,放弃excel,改用数据库软件,比如mysql。excel只是小型数据库
2021-04-25 18:41
William1949
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:109
专家分:0
注 册:2009-3-17
得分:0 
1.7g 不算大。


MyHex.rar (67.02 KB)

以上是我写的小程序。发这个程序不为别的,只是想展示一下,VB有能力读取大文件。

注意:
1、这个小程序的主要功能是:进制转换。与楼主 题意不符。
2、该程序是纯绿色的,不会产生临时文件,也不会改写系统的重要文件。也不会改写系统注册表的信息。
3、本人,在本电脑上用360查,无毒。
2021-04-27 10:03



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-505511-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.086334 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved