0

私は現在Pythonでテキストファイルを読み取るプログラムを入手しましたが、いくつかの理由でメモリに留まっている間はフォーマットが失われますが、情報としてその行と列が保持されます。この行と列の情報を使用して、最初に読み取ったファイルを再現することに興味があります。新しいファイル全体で一貫している限り、元の列と比較して列のスペースまたはタブの量が一致していなくても問題ありません。

私が思いついた最初の素朴な解決策の1つは、常に1行目と1列目へのポインターを保持し、行と列の情報をスパム\nwhite spacesて使用することでしたが、Pythonでそれを行うためのより良い方法があるかどうか疑問に思いました(実際にはこのポインタを最初の行と列に移動する方法もわかりません)。

Pythonで文字列、行、列、ファイルを4つのパラメーターとしてパラメーターとして受け取るいくつかのメソッドは、おそらく解決策になる可能性がありますが、この場合、(line、column)が占有されている場合に何が起こるかはわかりません(これは私の状況では決して起こらないので、実際には問題ではありません)。

編集:情報は複雑な「構造」に格納されますが、各文字列に行と列の情報が関連付けられている文字列のリストなどの情報を抽出できると言えば十分です。次に、この「メソッド」を使用して、各文字列とその列および行を取得し、ファイルの正しい位置に追加します。

編集2:唯一の仮定は、元のファイルからすべての単語を取得するときに、まったく同じ順序で発生するということです。つまり、元のファイルが「猫がジャンプした\ nが死ななかった」の場合、次の文字列が取得されると予想されます:''、'cat'、'jumped'、'and'、 ' 「しなかった」、「死ぬ」およびそれに関連する行と列。その場合、「but」、「did」、「not」、および「die」には、1ではなく2行目があり、すべての単語が関連する列になります(行が異なるため、重複する場合と重複しない場合があります)。

ありがとうございました。

4

2 に答える 2

0

行番号(y)に基づいてメモリ内の行を並べ替える必要があります。次に、範囲(1..N)のiの場合、N =元のファイルのページあたりの行数で、次のようになります。

- if there are rows with that y:
    - sort all rows with that y in that page using their x
    - start with j = 0, and for each text chunk:
       - write (x - j) spaces
       - write the chunk
       - set j equal to x plus the length of the chunk
- output a carriage return and continue

これにより、許容可能なバージョンのテキストが再構築されます。モジュロ8を少し変更すると、これらのxjスペースの一部をタブに置き換えることもできます。

于 2012-07-22T22:43:19.740 に答える
0

それが効率的かどうかはわかりませんし、何らかの作業が必要だと確信しています。catの例を使用して、サポートデータをモックアップし、それをテキストとして戻しました...エラーチェックはありませんが、これが基本だと思います...

import re
from operator import itemgetter

test = "The cat jumped \n but did not die"
lines = test.splitlines()
line_ref = []
for line in lines:
    words = list(re.finditer(r'(\S+)', line))
    line_ref.append((len(line), dict( (m.span(), m.group()) for m in words) ))


output = []
for line in line_ref:
    last = max(line[1], key=itemgetter(1))[1]
    textlist = [' '] * max(last, line[0])
    for (start, end), word in line[1].iteritems():
        textlist[start:end] = word
    output.append(''.join(textlist))

print '\n'.join(output)
于 2012-07-22T23:34:51.113 に答える