| 网站首页 | 业界新闻 | 群组 | 人才 | 技术文章 | 下载频道 | 博客 | 代码贴 | 编程论坛
绝地游戏外挂辅助教学千里之行 始于足下
共有 220 人关注过本帖
标题:如何加快两个TXT文件合并速度?
只看楼主 收藏
ictest
Rank: 2
等 级:论坛游民
帖 子:185
专家分:53
注 册:2010-2-17
结帖率:70.37%
  已结贴   问题点数:20  回复次数:5   
如何加快两个TXT文件合并速度?
有两个TXT文件——1.txt和2.txt,每个文件都4万行左右。1.txt的行数和2.TXT行数一致,两个文件每一行的内容都相互对应,现希望将2.TXT文件的每一行内容都插入1.TXT文件的每一行中,并生成一个新文件。如下是我的程序,已经能达到我的要求,但就是其中的“将2.TXT文件的每一行内容都插入1.TXT文件的每一行中”过程太慢,4万多行大概需要12分钟,请问这一段过程如何修改使之加快速度。

程序如下(红色部分就是最耗时间位置):

Private Sub Command4_Click()
Dim MyStr1() As String
Dim MyStr2() As String
Dim ttemp As String
Dim n As Long 'Integer
tt = Timer
'读取文档1到数组MyStr1里
n = 0
Open (Dir4.Path & "\" & File4.FileName) For Input As #1       '以读的方式打开文件
Do While Not EOF(1)   ' 循环至文件尾
   n = n + 1
   ReDim Preserve MyStr1(n)
   Line Input #1, MyStr1(n)   '读入一行
Loop
Close #1   ' 关闭文件。

'读取文档2到数组MyStr2里
n = 0
Open (Dir5.Path & "\" & File5.FileName) For Input As #1       '以读的方式打开文件
Do While Not EOF(1)   ' 循环至文件尾
   n = n + 1
   ReDim Preserve MyStr2(n)
   Line Input #1, MyStr2(n)   '读入一行
Loop
Close #1   ' 关闭文件。


'按照要求把数组里的内容组合到字符串变量
Dim MyStr As String
Dim i As Long
MyStr = ""
For i = 1 To UBound(MyStr1)
   MyStr = MyStr & Left(MyStr1(i), 45) & MyStr2(i) & Mid(MyStr1(i), 56) & vbCrLf
Label1.Caption = "已完成" & i & "行" '加个label显示进度
DoEvents '行太多了,防止程序假死
Next i


'写新建文档文件
   Open (Dir5.Path & "\新文档.txt") For Output As #1     '以输出方式打开文件
   Print #1, MyStr
Close #1   ' 关闭文件。

tt = Timer - tt
 MsgBox "ok" & vbCrLf & tt

End Sub

附 1.txt  2.txt  目标文件.txt
附件: 您没有浏览附件的权限,请 登录注册
2017-11-21 14:54
linta1
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2011-9-1
  得分:0 
还有人在学VB6?好像现在都在用WIN10,写的软件有点不兼容。你们怎么解决的?369007328
2017-11-21 22:36
ZHRXJR
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:53
帖 子:558
专家分:3188
注 册:2016-5-10
  得分:10 
'按照要求把数组里的内容组合到字符串变量
这样处理就慢得多,仍然使用数组就快了
声明数组: Dim MyStr3() As String ,用数组处理就快了。

程序代码:
Private Sub Command1_Click()
Dim MyStr1() As String, MyStr2() As String, MyStr3() As String
Dim ttemp As String, XX As String, n As Long, M As Long
tt = Timer
n = 0
Open (App.Path & "\1.txt") For Input As #1        '以读的方式打开文件,文件在程序的根目录
Do While Not EOF(1)   ' 循环至文件尾
   n = n + 1    '得到文件的行数,也就是数组的下标
   Line Input #1, XX
Loop
Close #1   ' 关闭文件。
   ReDim MyStr1(1 To n), MyStr2(1 To n), MyStr3(1 To n)   '既然二个文件行数一样,在这里声明数组下标就可以,不需要分别声明
M = 0
Open (App.Path & "\1.txt") For Input As #1        '以读的方式打开文件,文件在程序的根目录
Do While Not EOF(1)   ' 循环至文件尾
   M = M + 1
   Line Input #1, MyStr1(M)     '读取1.txt到数组MyStr1里   读入每一行
Loop
Close #1   ' 关闭文件。
M = 0
Open (App.Path & "\2.txt") For Input As #1       '以读的方式打开文件,文件在程序的根目录
Do While Not EOF(1)   ' 循环至文件尾
   M = M + 1
   Line Input #1, MyStr2(M)   '读取2.txt到数组MyStr2里   读入每一行
Loop
Close #1   ' 关闭文件。
For i = 1 To n
MyStr3(i) = Left(MyStr1(i), 45) & MyStr2(i) & Mid(MyStr1(i), 56)  '将数组MyStr1与MyStr2按要求存储到MyStr3中
Next i
'写新建文档文件
   Open (App.Path & "\新文档.txt") For Output As #1     '以输出方式打开文件,文件在程序的根目录
   For i = 1 To n
    Print #1, MyStr3(i)
   Next i
Close #1   ' 关闭文件。
tt = Timer - tt
 MsgBox "ok,    文件合并成功。" & Space(4) & tt & ""
End Sub

    供参考。

耗时0.5秒多一点。
附件: 您没有浏览附件的权限,请 登录注册

QQ    2653043392
2017-11-22 13:03
wds1
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:6
帖 子:41
专家分:217
注 册:2016-3-10
  得分:10 
你的程序慢的原因是,每次读取一行都需要重新分配内存和比较,而且还大量进行内存累加。
比较好的方法是一次性读取到内存,直接合并输出,一般4万条,不会超过10秒。

读取方法如下:
 Dim By() As Byte
 Open (Dir4.Path & "\" & File4.FileName) For Binary As #1'以二进制方式读取
 ReDim By(1 To LOF(1))'重新定义字节大小,相当于一次性分配内存
 MyStr1 = Split(Input(LOF(1), 1), vbNewLine)'把文件1的全部数据读入MyStr1数组
 close #1  
 '文件2的类似
 Open (Dir5.Path & "\新文档.txt") For Output As #3     '以输出方式打开文件
 max=UBound(MyStr1) - 1
  For i = 0 To max
   MyStr =  Left(MyStr1(i), 45) & MyStr2(i) & Mid(MyStr1(i), 56)
   Print #1,  MyStr1'直接文件行输出,比你内存变量每次累加速度快
   if i mod 100= 0 then Label1.Caption = "已完成" &  str(i/max) '显示刷新频率太高没用还浪费时间,增加个显示控制
   DoEvents '行太多了,防止程序假死  
  Next i
  close #3

2017-11-22 13:12
wds1
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:6
帖 子:41
专家分:217
注 册:2016-3-10
  得分:0 
WIN7,8,10可以安装vb6精简版,编译后可以绿色移植到XP,WIN7,8,10。

出现不兼容主要是你使用的OCX控件版本不同,解决方法是,把你程序用到的OCX放到你的程序目录,之后regsvr32注册。
如果注册失败,说明注册ocx依赖的dll缺失,用Depends工具看OCX使用的dll,复制到ocx同一目录即可注册成功。

2017-11-22 13:21
ictest
Rank: 2
等 级:论坛游民
帖 子:185
专家分:53
注 册:2010-2-17
  得分:0 
感谢ZHRXJR版主和wds1,你们的回复让我茅塞顿开,你们的编程水平让我五体投地,vb语言博大精深,我还有很长的路要走。
2017-11-23 07:27







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

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