4

わずかに異なる次の2つのファイルについて考えてみます。

foo(旧バージョン):

<Line 1> a
<Line 2> b
<Line 3> c
<Line 4> d

foo(新しいバージョン):

<Line 1> a
<Line 2> e
<Line 3> b
<Line 4> c
<Line 5> f
<Line 6> d

ご覧のとおり、新しいファイルに文字efが導入されています。

古いファイルに対応する行番号のセットがあります…たとえば、、、、1および34文字、、、およびに対応しaますcd

新しいファイルの対応する文字の行番号を取得できるように、これら2つのファイル間でマッピングを行う方法はありますか?

EG、結果は次のようになります。

Old file line numbers (1,3,4) ===> New File line numbers (1,4,6)

残念ながら、私はemacs(ediffが機能している)、Python、winmergeしか自由に使えません。

4

2 に答える 2

2

必要なのは、テキスト (新しいバージョンの foo) 内で検索する複数のパターン (古いバージョンの foo の行)がある文字列検索アルゴリズムです。Rabin-Karpアルゴリズムは、この種のタスク向けのアルゴリズムの 1 つです。私はそれをあなたの問題に適応させました:

def linematcher(haystack, needles, lineNumbers):
    f = open(needles)
    needles = [line.strip() for n, line in enumerate(f, 1) if n in lineNumbers]
    f.close()

    hsubs = set(hash(s) for s in needles)
    for n, lineWithNewline in enumerate(open(haystack), 1):
        line = lineWithNewline.strip()
        hs = hash(line)
        if hs in hsubs and line in needles:
            print "{0} ===> {1}".format(lineNumbers[needles.index(line)], n)

old_foo.txt2 つのファイルが呼び出され、new_foo.txtこの関数を次のように呼び出すと仮定します。

linematcher('new_foo.txt', 'old_foo.txt', [1, 3, 4])

あなたのデータを試してみると、次のように印刷されました。

1 ===> 1
3 ===> 4
4 ===> 6
于 2011-12-01T06:42:36.023 に答える