- ベストアンサー
perl 読込ファイルの分割について
下記のようなファイルがあります。 1234: 4(グループ名: 要素数) AB(要素1) CD(要素2) EFG(要素3) HIJ(要素4) 2345: 1(グループ名: 要素数) XYZ(要素1) ○○: XX ・・・ :の行が区切られる単位とし、:の後の数字がそのグループに入る要素数である。 その要素数毎にファイル分割(要素のみ記述されたファイル)したいです。 perlプログラムで どのように書けば よいのか教えてください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
1)読んだ行が区切られる単位なのか、要素なのかを分けて、 2)指定されたファイル名でオープンしたり、出力が終わったらクローズしたり を割とそのまま書けばよいかと思います。 # 質問文中ではコロンやスペースが全角なのでそのつもりで書いてあります my $items = 0; # これからファイルに出力する行数 while (<>) { if ($items == 0 && /:/) { # :の行が区切られる単位とし、 chomp; my ($name, $num) = split(/:/); $num =~ s/ //g; # 全角スペースが入っているようなので消しておく $items = int($num); # :の後の数字がそのグループに入る要素数である。 print "$name, $items\n"; open OUT, ">$name" or die "Cannot open $name..."; }elsif ($items > 0) { # データ数分出力 print OUT $_; if (--$items == 0) { # 最後の項目だったら close OUT; # ここでおしまい } } } # 最初の if に $items == 0 が入れてあるのは、項目にコロンが入っていたらハマるからですが、 # 先に if ($items > 0) { ... } elsif (/:/) { ... } と書けば条件式はシンプルになります。 # ここでは(データファイルの出力順に合わせて)グループ名の指定かどうか判定する方を先にしました。
お礼
1行1行 何をやっているか説明いただき、ありがとうございます。 まさに このような方法でやりたかったので、これを参考にし、実行してみます。