-2

Python で課題をやっているときに問題が発生しました。私はpythonが初めてなので、完全な初心者です。

質問: 以下の 2 つのファイルをマージするにはどうすればよいですか?

s555555,7
s333333,10
s666666,9
s111111,10
s999999,9

s111111,,,,,
s222222,,,,,
s333333,,,,,
s444444,,,,,
s555555,,,,,
s666666,,,,,
s777777,,,,,

マージ後、次のようになります。

s111111,10,,,,
s222222,,,,,
s333333,10,,,,
s444444,,,,,
s555555,7,,,,
s666666,9,,,,
s777777,,,,,
s999999,9,,,,

読んでくれてありがとう。

4

3 に答える 3

4

問題への 1 つのアプローチとして実行できる手順を次に示します。ここでは、さまざまなファイル名としてFileAFileBおよびを使用します。Result

この問題に対処する 1 つの方法は、ファイル内の各位置 (各,) に番号を付けて参照することです。次に、 から行を読み取ります。最初の行の後に、結果を作成するためにから最初の行を配置する必要があるFileAことがわかります。に書き出します。,FileBResult

  1. 開くFileAwith statement完了するとファイルが自動的に閉じられるため、理想的には を使用する必要があります。または、通常のopen()呼び出しを使用することもできますが、完了したら必ずファイルを閉じてください。

  2. の各行をループしてFileA、 に追加しlistます。(ヒント: を使用する必要がありますsplit())。なぜリスト?これは私たちの計画であるため、インデックスで項目を参照しやすくします。

  3. に対して手順 1 と 2 を繰り返しますFileBが、別のリスト変数に格納します。

次の部分は、 からの行のリストをループし、FileAそれらを からのリストと照合して、ファイルFileBに書き込む新しい行を作成することです。Resultこれには多くの方法がありますが、簡単な方法は次のとおりです。

  1. まず、結果を保存する空のリストを作成します ( final_lines = [])
  2. FileAループ内の for 行を含むリストをforループします。

FileAまた、 のすべての行に対応する行が にあるわけではないことにも注意してくださいFileB。のリストの最初の「ビット」ごとにFileA、 のリストで対応する行を見つけてから、FileBを使用して次の項目を取得しますindex()0最初の項目は常にであり、次の項目は常に であることに熱心であれば1、値を単純にハードコーディングしてみませんか? 課題を見ると; 複数,の があるため、ある時点で 4 番目または 5 番目の「列」を追加する必要がある可能性があります。教師はこのようなものをチェックするのが大好きです。

  1. append()に正しい順序で項目を追加するために使用しfinal_linesます。

行のリストが準備できたので、最後の部分は簡単です。

  1. 新しいファイルを開く (withまたはを使用open)
  2. ループスルーfinal_lines
  3. 各行をファイルに書き出します (行末文字を忘れないようにしてください)。
  4. ファイルを閉じます。

ご不明な点がございましたら、お問い合わせください。

于 2012-08-16T04:52:10.857 に答える
2

Python には関係ありませんが、Linux では次のようになります。

sort -k1 c1.csv > sorted1
sort -k1 c2.csv > sorted2
join -t , -11 -21 -a 1 -a 2 sorted1 sorted2

結果:

s111111,10,,,,,
s222222,,,,,
s333333,10,,,,,
s444444,,,,,
s555555,7,,,,,
s666666,9,,,,,
s777777,,,,,
s999999,9
于 2012-08-16T04:12:31.643 に答える
1

最初の要素を主キーとして使用して辞書を作成し、行をマージしますか?

このようなもの:

f1 = csv.reader(open('file1.csv', 'rb'))
f2 = csv.reader(open('file2.csv', 'rb'))

mydict = {}
for row in f1:
    mydict[row[0]] = row[1:]

for row in f2:
    mydict[row[0]] = mydict[row[0]].extend(row[1:])

fout = csv.write(open('out.txt','w'))
for k,v in mydict:
    fout.write([k]+v)
于 2012-08-16T03:20:15.813 に答える