1

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

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

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

尝试3:

我有一个包含这种格式信息的文件:

#x 是一行

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

有数百万行。

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

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

我想使用第一个文件中的 x[#] 和第二个文件中的 x[#],我想看看这两个值是否匹配,如果它们匹配,我想输出这些值以及其他几个 x[#] 值第二个文件,它们在同一行。

这对理解有帮助吗?文件的格式就像我说的那样:(但有数百万,我想在两个文件中找到对,因为它们都应该匹配)

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

来自文件 1 的数据:

 (N'068D556A1A665123A6DD2073A36C1CAF', N'A76EEAF6D310D4FD2F0BD610FAC02C04DFE6EB67',    
N'D7C970DFE09687F1732C568AE1CFF9235B2CBB3673EA98DAA8E4507CC8B9A881');

来自文件 2 的数据:

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] 上的对应匹配输出到一个文件,以及其他 file1[x],其中 x 可以是该行的任何索引。

4

3 回答 3

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)
于 2012-06-28T22:17:09.313 回答
2

我从澄清中得到了什么:

  • file1 和 file2 的格式相同,每一行看起来像

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

  • 对于同时出现在 file1 和 file2 中的每个键,您需要合并输出,所以每一行看起来像

    {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

我仍然不知道您试图通过“以及其他 file1[x] 进行通信,其中 x 可以是该行中的任何索引”。

于 2012-06-29T17:58:47.883 回答
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()
于 2012-06-28T22:26:41.083 回答