2014-01-11 39 views
-2

我有兩個文件,兩者都非常大。這些文件混合了它們之間的信息,我需要比較兩個文件並連接相交的線。從兩個filles連接類似的線

一個例子是:

一號文件有

var1:var2:var3 

2日將有

var2:var3:var4 

我需要這些在第三個文件,輸出連接:var1:var2:var3:var4。 請注意,行不匹配,var4應與var1一起使用(因爲它們有var2var3在一起)。 Var2和Var3在Var1和Var4中很常見。可能在這些巨大的文件中很遙遠。 我需要找到一種方法來比較每一行並將其連接到第二個文件中的一行。我似乎無法想到任何足夠的循環。有任何想法嗎?

+0

你如何辨別時,兩行有兩個或更多的記錄(在你的例子中「var _ _」)是共同的嗎?至少有一個共同點? – mojo

+0

創建的第三個文件必須採用以下格式:var1:var2:var3:var4。 var2和var3對於var1和var3是很常見的。 Var2和Var3總是成對出現,所以如果一個是共同的,另一個是共同的。 – user3184354

+0

你保證'var2'只出現在每個文件中一次嗎?兩個文件之間的「十字路口」是否保證只存在一次?也就是說,從file1開始的一行,是否會有多行包含它所包含的記錄(例如'var2'或'var4')? – mojo

回答

0

根據你說,你要匹配的特定字段(2 & 3從文件1,1 & 2從文件2):

#!/usr/bin/python3 

# Iterate over every line in file1. 
# Iterate over every line in file2. 
#  If lines intersect, print combined line. 

with open('file1') as file1: 
    for line1 in file1: 
     u1,h1,s1 = line1.rstrip().split(':') 

     with open('file2') as file2: 
      for line2 in file2: 
       h2,s2,p2 = line2.rstrip().split(':') 

       if h1 == h2 and s1 == s2: 
        print(':'.join((u1,h1,s2,p2))) 

這是窘況慢(理論上),但使用最少的RAM。如果這些文件不是絕對巨大的,它可能不會太糟糕。

+0

謝謝,這工作完美。 – user3184354

1

試試下面的(這兩個文件假設var2:var3總是唯一的密鑰):

  1. 迭代中的第一個文件
    • 所有線路將所有項目分成dictionary與關鍵價值var2:var3 (和var1作爲值)
  2. 遍歷在第二個文件中的所有條目
    • 如果來自第1部分的字典包含關鍵字var2:var3的條目,並且它確實將var1:var2:var3:var4輸出到輸出文件並從字典中刪除條目,則會查找該條目。

這種方法可以使用非常大的內存量,因此應該不會被用於非常大的文件。

0

如果內存沒有問題,使用字典,其中的關鍵是一樣的價值:「相交」

#!/usr/bin/python 

out_dict = {} 

with open ('file1','r') as file_in: 
    lines = file_in.readlines() 
    for line in lines: 
     out_dict[line] = line 

with open ('file2','r') as file_in: 
    lines = file_in.readlines() 
    for line in lines: 
     out_dict[line] = line 

with open ('output_file','w') as file_out: 
    for key in out_dict: 
     file_out.write (key) 
+0

這一行寫出兩條相交的線條和不相交的線條。 – user3184354

+0

我誤解了你嗎?任何線將示出僅一次:如果file1 VAR1 VAR2 VAR3 ,和file2是VAR2 VAR3 VAR4 輸出文件將是VAR1 VAR2 VAR3 VAR4。這不是你要求的嗎? –