電子書籍の厳選無料作品が豊富!

下記のようなファイルがあります。
1234: 4(グループ名: 要素数)
AB(要素1)
CD(要素2)
EFG(要素3)
HIJ(要素4)

2345: 1(グループ名: 要素数)
XYZ(要素1)

○○: XX
・・・

:の行が区切られる単位とし、:の後の数字がそのグループに入る要素数である。
その要素数毎にファイル分割(要素のみ記述されたファイル)したいです。
perlプログラムで どのように書けば よいのか教えてください。

A 回答 (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 (/:/) { ... } と書けば条件式はシンプルになります。
# ここでは(データファイルの出力順に合わせて)グループ名の指定かどうか判定する方を先にしました。
    • good
    • 0
この回答へのお礼

1行1行 何をやっているか説明いただき、ありがとうございます。
まさに このような方法でやりたかったので、これを参考にし、実行してみます。

お礼日時:2011/12/09 09:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!