1

情報をソートしたファイルがあり、そのファイルの特定のインデックスを別のファイルのインデックスと比較したいのですが、問題の 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[#] と 2 番目のファイルの x[#] を使用したいのですが、これら 2 つの値が一致するかどうかを確認し、一致する場合はそれらを出力したいと思います。同じ行にある 2 番目のファイル。

それは理解するのにまったく役立ちましたか?ファイルの形式は私が言ったようなものです:(しかし、何百万ものファイルがあり、すべてが一致する必要があるため、2 つのファイルでペアを見つけたいと思います)

  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}
    
  • ファイルはキーの昇順でソートされます

  • 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

指定されたインデックスにある2つのファイルの内容を比較します。

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()

2つのファイルを1行ずつ比較して、一致するかどうかを確認します。一致しない場合は、次の行を出力します。

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 に答える