2014-01-11 38 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。这不是你要求的吗? –