VBGood網站全文搜索 Google

搜索VBGood全站網頁(全文搜索)

VB愛好者樂園(VBGood)

 找回密碼
 立即注冊
搜索
查看: 1239|回復: 4
打印 上一主題 下一主題

兩個文本文件如何按要求合并?

[復制鏈接]
跳轉到指定樓層
1
發表于 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, 下載次數: 151)

B.rar (30.55 KB, 下載次數: 140)

請版主和路過的壇友及高手不吝賜教,多謝多謝!
2
發表于 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 很給力

查看全部評分

回復 支持 反對

使用道具 舉報

3
發表于 2019-7-11 09:55:36 | 只看該作者
用Python寫的話會比較方便
VB需要字典對象輔助,不然輪詢的話慢死你。

評分

參與人數 1威望 +10 收起 理由
bruly + 10 很給力

查看全部評分

回復 支持 反對

使用道具 舉報

4
發表于 2019-7-11 18:59:24 | 只看該作者
JuncoJet 發表于 2019-7-11 09:55
用Python寫的話會比較方便
VB需要字典對象輔助,不然輪詢的話慢死你。

我覺得用VB有更快的方法,不知對不對,比如:
     先對A、B兩個文件中的內容排序,同時分別記下排序后,每行前兩個數字相同的數字有多少組,就定義為數組變量的維,每組有多少個,就定義為最大上限。
     這樣就不用一個一個全部去循環了,只需要按剛才記下的數組循環就能達成,循環的任務量減少百分之九十。
回復 支持 反對

使用道具 舉報

5
發表于 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, 2020-1-13 15:00

VB愛好者樂園(VBGood)
快速回復 返回頂部 返回列表
快乐十分开奖结查询