VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)

VB爱好者乐园(VBGood)

 找回密码
 立即注册
搜索
查看: 575|回复: 4

两个文本文件如何按要求合并?

[复制链接]
发表于 2019-7-10 08:30:53 | 显示全部楼层 |阅读模式
两个文本文件,A和B,A里面有40000条数据,B里面有28000条数据,都是一条一行,数据格式都一样:“a,b,c”。现在想从A文本里开始读起,读一条,就在B文本里搜寻前两个数字(a和b)一样的一条数据,如果找不到就在新建的文本文件C里写入A文件里的这一条,如果找到了,就在新建的文本文件C里写入B文件里的这一条(相当于用B文件里的这一条替换A文件里的这一条),最后,C文件里的条目数和A文件一致,C文件里的排列顺序和A文件一致。

我编写的程序如下:(问题:1、慢,想想要循环40000*28000次,10亿多次呢!怎么解决?
                          2、好象逻辑有错误,转出来的C文件与A文件完全一致,肯定应该不一致。)


  1. Dim fn As Integer, str1 As String, str2 As String, tmp1, tmp2, i, j As Long
  2. Dim a() As String
  3. Dim b() As String
  4. Dim cc As String
  5.     fn = FreeFile
  6.     Open "D:\A.txt" For Binary As #fn
  7.         str1 = Input(LOF(fn), fn)
  8.         tmp1 = Split(str1, vbCrLf, -1)
  9.     Close #fn

  10.     fn = FreeFile
  11.     Open "D:\B.txt" For Binary As #fn
  12.         str2 = Input(LOF(fn), fn)
  13.         tmp2 = Split(str2, vbCrLf, -1)
  14.     Close #fn
  15.    
  16. Open "D:\C.txt" For Append As #2
  17.      For i = LBound(tmp1) To UBound(tmp1) - 1
  18.          For j = LBound(tmp2) To UBound(tmp2) - 1
  19.                        a = Split(tmp1(i), ",")
  20.                        b = Split(tmp2(j), ",")
  21.                      If a(0) = b(0) And a(1) = b(1) Then
  22.                         cc = tmp2(j)
  23.                         Else
  24.                         cc = tmp1(i)
  25.                      End If
  26.         Next j
  27. If cc <> "" And aa <> "" Then
  28.             Print #2, cc
  29. End If
  30.     Next i
  31. Close #2
复制代码



文件:
A.rar (40.83 KB, 下载次数: 75)
发表于 2019-7-10 21:16:38 | 显示全部楼层
试试用这部分替换一下

  1.     Dim Flag As Boolean

  2.      For i = LBound(tmp1) To UBound(tmp1) - 1
  3.      
  4.          Flag = False
  5.          
  6.          For j = LBound(tmp2) To UBound(tmp2) - 1
  7.          
  8.                 a = Split(tmp1(i), ",")
  9.                 b = Split(tmp2(j), ",")
  10.                
  11.                 If a(0) = b(0) And a(1) = b(1) Then
  12.                     Flag = True
  13.                     Exit For
  14.                 End If
  15.                
  16.         Next j
  17.         
  18.         If Flag Then
  19.             Print #2,tmp2(j)
  20.         Else
  21.             Print #2, tmp1(i)
  22.         End If


  23.     Next i
复制代码

评分

参与人数 1威望 +10 收起 理由
bruly + 10 很给力

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2019-7-11 09:55:36 | 显示全部楼层
用Python写的话会比较方便
VB需要字典对象辅助,不然轮询的话慢死你。

评分

参与人数 1威望 +10 收起 理由
bruly + 10 很给力

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2019-7-11 18:59:24 | 显示全部楼层
JuncoJet 发表于 2019-7-11 09:55
用Python写的话会比较方便
VB需要字典对象辅助,不然轮询的话慢死你。

我觉得用VB有更快的方法,不知对不对,比如:
     先对A、B两个文件中的内容排序,同时分别记下排序后,每行前两个数字相同的数字有多少组,就定义为数组变量的维,每组有多少个,就定义为最大上限。
     这样就不用一个一个全部去循环了,只需要按刚才记下的数组循环就能达成,循环的任务量减少百分之九十。
回复 支持 反对

使用道具 举报

发表于 2019-7-12 16:46:18 | 显示全部楼层
bruly 发表于 2019-7-11 18:59
我觉得用VB有更快的方法,不知对不对,比如:
     先对A、B两个文件中的内容排序,同时分别记下排序后 ...

排序就已经很费时间了,字典使用的HASH表,双叉树。插入查询速度都是普通算法无法比的。

评分

参与人数 1威望 +5 人气 +2 收起 理由
bruly + 5 + 2 很给力

查看全部评分

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

文字版|手机版|小黑屋|VBGood  

GMT+8, 2019-9-22 02:00

VB爱好者乐园(VBGood)
快速回复 返回顶部 返回列表