• ベストアンサー

ファイルへの追加入力

最近Perlでプログラムを始めた初心者で、書籍やネットを参考にしています。 今作りたいと思っているのはファイルから数字の列を読み込み、別のファイルに書き加えることです。 こういう感じです。 file 1 1 1 2 2 3 3 4 4 5 5 file 2 1 6 2 7 3 8 4 9 5 10 でfile 2の二列目をfile 1に追加して 1 1 6 2 2 7 3 3 8 4 4 9 5 5 10 としてfile 3に保存することです。 ファイルの読み込み、書き出しは どうにか自力で解決できたつもりになっていますが 列の追加がよくわかりません。 どなたか 教えていただけるとありがたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • thatsthat
  • ベストアンサー率55% (15/27)
回答No.3

もし、file1,file2ともに、一番左の列がいつも1,2,3,....で かつ、両ファイルの行数もいつも同じなのだとしたら、 no1さんへの補足にあるソースは、かなり惜しいですね・・・。 while(<file1>){ chomp; @a=split; $_=<file2>; chomp; @b=split; print file3 "$a[0], $a[1], $b[1]\n"; } で良いと思います。

Hiro_Eriko
質問者

お礼

thatsthatさま 修正していただいたのを使ったら うまく列を追加することができました。 たいへんありがとうございました。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

こんな感じかな: open(FILE1, "<file1"); while (<FILE1>) { chomp; push @line, [split]; } open(FILE2, "<file2"); my $i = 0; while (<FILE2>) { chomp; push @{$line[$i]}, (split)[1]; } open(FILE3, ">file3"); foreach $l (@line) { print FILE3 "$l->[0] $l->[1] $l->[2]\n"; } 結局, 全データを覚えておかないとしょうがないわけで.

Hiro_Eriko
質問者

補足

Tacosanさん 丁寧にありがとうございます。 pushを知りませんでした。 自分で作ったのにTacosanのを参考にして頑張ってみましたが うまくいかないです。 もう少し頑張ってみます。

  • hkd9001
  • ベストアンサー率48% (99/204)
回答No.1

こんばんは。 さて、この場合ですが、次のような手順では いかがでしょうか? (1)file1 から読み込んだデータを、配列 a に保存する。(@a[0]~@a[4])→配列の添え字は1でなく0から始まることに注意。以下同じ (2)file2 から読み込んだデータを、配列 b に保存する。。(@b[0]~@b[4]) (3)whileループなどを使って、@a[$i].",".@b[$i] というデータを file3 に書き込む(ただし、$i は 0 から 4 まで、1刻みで変化させる)。 ちなみに、このように1行の中に複数のデータをカンマで分けて記述したデータを、 csv (comma separated value)といいます。

Hiro_Eriko
質問者

補足

hkd9001さま どうもありがとうございました。 ファイル名を読み込んで 配列にして というのは以下のような手順にしていますが うまくいきません。 open (file1, $inputfile); open (file2, $stdfile); open (file3, ">$outputfile"); while(<file1>){ @a=split;} while(<file2>){ @b=split; print file3 "@a[0], @a[1], @b[1]\n";} 実行後には 1 1 6 2 2 7 3 3 8 4 4 9 5 5 10 ではなくて 1 1 10 2 2 10 3 3 10 4 4 10 5 5 10 のようになっています。 お手数ですが もう少しアドバイスいただけませんか?

関連するQ&A