• 締切済み

【Perl】テキストファイルの処理方法について

テキストファイルの一括処理をしたいです。 同じ形式で書かれている下記のような ファイルが複数個あり全てのファイルの 同フィールドだけ抜き出し、 抜き出した全てのデータを右側列にコンマ区切りで並べて 出力させたいのですがうまく並べられません。 配列がうまく使えていないと思うのですが アドバイスをいただけませんでしょうか。 データは&で区切られておりこの例では左から3番目のフィールドを 処理の対象としてます。 file01 A&111&222&333& A&444&555&666& A&777&888&999& file02 A&aaa&bb&cc& A&ddd&ee&fff& A&ggg&hhh&iiii& file03 A&abab&bnb&ccc& A&abab&bnb&ccc& A&abab&bnb&ccc& A&abab&bnb&ccc& 希望出力結果 222,bb,bnb, 555,ee,bnb, 888,hhh,bnb, ,,bnb, 希望結果のようなファイルを出力させたいです。 よろしくお願いします。

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

質問にある条件だけならこんなのでも。 #!/usr/bin/perl use strict; use warnings; use Fatal qw(:void open close); my $isep = '&'; my $osep = ','; open my $fp1, '<', shift; open my $fp2, '<', shift; open my $fp3, '<', shift; while (1) { my $rec1 = <$fp1>; my $rec2 = <$fp2>; my $rec3 = <$fp3>; last if !$rec1 && !$rec2 && !$rec3; my @field1 = split $isep, $rec1 if $rec1; my @field2 = split $isep, $rec2 if $rec2; my @field3 = split $isep, $rec3 if $rec3; my @of; push @of, $rec1 ? $field1[2] : ''; push @of, $rec2 ? $field2[2] : ''; push @of, $rec3 ? $field3[2] : ''; print join($osep, @of), "\n"; } 実行結果: 222,bb,bnb 555,ee,bnb 888,hhh,bnb ,,bnb やっつけで書いたのでリファインの余地が大いにあります。

noname#64231
質問者

お礼

ありがとうございました。 参考にさせていただきます。 お手数をおかけいたしました。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

ん~, 全データを一旦配列に入れておけばいいだけだと思うんだけどなぁ. そんなに難しくないと思う. 例えば $i 番目のファイルの $j 行目にある, $k 番目のデータを $data[$I][$j][$k] に入れる... とか. 現状どうなってるかわからんのでなんともアドバイスしにくいんだけど.

noname#64231
質問者

お礼

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

noname#64231
質問者

補足

ありがとうございます。 質問の書き方が漠然としており申し訳ありません。 なにぶんビギナーの為つまづいておりました。 助言のおかげでなんとかうまくいけそうです。

すると、全ての回答が全文表示されます。

関連するQ&A