2012-06-28 95 views
1

我该如何解决这个问题,我有我已经对信息进行了排序的文件,我想比较该文件中的某个索引与在另一个索引中,一个问题是文件非常大,数百万行。我想逐行比较我有的文件,如果它们匹配,我想使用索引方法输入这些值以及其他值。逐行比较文件以查看它们是否相同,如果是这样的话输出它们

=======================

让我澄清一下,我要好好说行[X]的X将保持不变因为它的格式是一致的,我想在另一个文件中对行[y]运行line [x],我想对整个文件执行此操作,并将每个匹配对输出到另一个文件。在另一个文件中,我也希望能够包含第一个文件中的其他部分,就像添加更多索引一样;行[a],行[b],行[c],行[d],最后行[y]作为与该信息的匹配。

尝试3:

我在这个格式信息的文件:

#x是一条线

x= data,data,data,data,data,data 

还有数以百万计的那行。

我还有一个文件,相同的格式:

xis a line 
    x= data,data,data,data 

我想用X [#]从第一个文件,并从第二个文件X [#],我想看看这两个值匹配,如果他们我想要输出这些,以及来自第二个文件中的其他几个x [#]值,它们在同一行上。

这样做有帮助吗? 格式的文件是像我说:(但是有几百万,我想找到两个文件对,因为他们都应该匹配)的文件1

line 1 data,data,data,data 
    line 2 data,data,data,data 

数据:

从文件2
(N'068D556A1A665123A6DD2073A36C1CAF', N'A76EEAF6D310D4FD2F0BD610FAC02C04DFE6EB67',  
N'D7C970DFE09687F1732C568AE1CFF9235B2CBB3673EA98DAA8E4507CC8B9A881'); 

数据:

00000040f2213a27ff74019b8bf3cfd1|index.docbook|Redhat 7.3 (32bit)|Linux 
00000040f69413a27ff7401b8bf3cfd1|index.docbook|Redhat 8.0 (32bit)|Linux 
00000965b3f00c92a18b2b31e75d702c|Localizable.strings|Mac OS X 10.4|OSX 
0000162d57845b6512e87db4473c58ea|SYSTEM|Windows 7 Home Premium (32bit)|Windows 
000011b20f3cefd491dbc4eff949cf45|totem.devhelp|Linux Ubuntu Desktop 9.10 (32bit)|Linux 

它在排序顺序是字母数字的,我想使用的滑块方法。我的意思是,如果file1 [x]是< file2 [x]将滑块向下或向上移动,取决于一个值是否大于另一个值,直到找到匹配,如果是,则打印输出以及其他值这将识别该散列。

我想要什么,结果将是:

file1的[x]和上file2的其相应的匹配[X]输出到文件中,以及其它文件1 [x]其中x可以是从任何索引该线。

+0

对于数百万行来说,如果您有足够的内存,dict就足够了 – PasteBT

+1

如果您有权访问标准POSIX实用程序,'comm -12 file1 file2'将仅输出两者共有的行。这是最终目标吗?你会执行更多的搜索,而不是插入?或者比搜索更多的插入? – sarnold

+0

我不完全清楚你真的想要什么。你想只比较file1 [N]到file2 [N],还是想比较file1 [N]和file2 [M],其中N和M可能相等也可能不相等?你的问题的不同部分似乎暗示了两者。 –

回答

2

什么我得到澄清:

  • 文件1和文件2是相同的格式,每一行看起来像

    {32 char hex key}|{text1}|{text2}|{text3} 
    
  • 文件按升序由关键

  • 对于出现在两个文件1和文件2每个键排序,你希望合并后的输出,所以每行看起来像

    {32 char hex key}|{text11}|{text12}|{text13}|{text21}|{text22}|{text23} 
    

你基本上要由合并排序的碰撞:

import csv 

def getnext(csvfile, key=lambda row: int(row[0], 16)): 
    row = csvfile.next() 
    return key(row),row 

with open('file1.dat','rb') as inf1, open('file2.dat','rb') as inf2, open('merged.dat','wb') as outf: 
    a = csv.reader(inf1, delimiter='|') 
    b = csv.reader(inf2, delimiter='|') 
    res = csv.writer(outf, delimiter='|') 

    a_key, b_key = -1, 0 
    try: 
     while True: 
      while a_key < b_key: 
       a_key, a_row = getnext(a) 
      while b_key < a_key: 
       b_key, b_row = getnext(b) 
      if a_key==b_key: 
       res.writerow(a_row + b_row[1:]) 
    except StopIteration: 
     # reached the end of an input file 
     pass 

我仍然不知道你想通过'以及其他文件1 [x]来通信,其中x可以是行中的任何索引'。

+0

所有我的意思是输出其他值,这些值可以将哈希标识为来自该行的信息,例如操作系统版本#等信息。 “file1 [x]”就是一个例子,这意味着file1及其索引在列表中,x只代表一个变量,可以是任何数字,该数字将标识前面提到的项目的位置; OS,版本号。 – Ferdinand

3

使用此方法并逐行比较比较,您不必将文件存储在内存中,因为文件的大小很大。

with open('file1.txt') as f1, open('file2.txt') as f2, open('file3.txt','w') as f3: 
    for x, y in zip(f1, f2): 
     if x == y: 
      f3.write(x) 
+0

这并不清楚,这符合他想要的。他说他想比较一个文件中的“特定索引”与另一个文件中的某个索引。例如,我会问这个问题(例如)文件1的第10行是否与文件2的第20行相同。 –

+0

@JerryCoffin OP还提到'我想逐行比较我拥有的文件,如果它们与我匹配。 ..' –

+0

是的,这个问题对我来说似乎还不太清楚,所以我添加了一条评论,要求澄清这一点。 –

1

比较两个文件的内容指定索引处:

fp1 = open("file1.txt", "r") 
fp2 = open("file2.txt", "r") 

fp1.seek(index) 
fp2.seek(index) 

line1 = fp1.readline() 
line2 = fp2.readline() 

if line1 == line2: 
    print(line1) 

fp1.close() 
fp2.close() 

比较一行两个文件网上看它们是否匹配,否则打印线:

fp1 = open("file1.txt", "r") 
fp2 = open("file2.txt", "r") 

line1, line2 = fp1.readline(), fp2.readline() 

while line1 and line2: 
    if line1 != line2: 
     print("Mismatch.\n1: %s\n2: %s" % (line1, line2)) 

fp1.close() 
fp2.close() 
相关问题