プロが教える店舗&オフィスのセキュリティ対策術

Perlでテキストデータの集計を行いたいのですが、集計のプログラムが上手く作れずに困っています。
元のテキストとして、

あいうえお。かきくけこ。さしすせそ。たちつてと。あいうえお。

というものがあり、整形プログラムとしては、

while(<>){
s/。/。\n/g;
print"$_";
}

があります。このプログラムを使って、

あいうえお。
かきくけこ。
さしすせそ。
たちつてと。
あいうえお。

という形に整形ところまではできたのですが、上記のプログラムに追加する形で、

あいうえお。 2
かきくけこ。 1
さしすせそ。 1
たちつてと。 1

というように同一の行の集計を行えるようにしたいです。
元のテキストデータから整形と集計を1つのプログラムで行えるようにしたいのですが、どうすれば良いのでしょうか?

A 回答 (6件)

えぇと....


<@data> とか <@out> とかで何をしたいのでしょうか>#4. こんなところでグロブする必要性は見えないのですが....
あと, @ARGV は Perl の変数であって「環境変数」じゃないよ. 環境変数は %ENV からアクセスする.
まあ #3 では変な方向に走ったけど, わかりやすくするなら #2 のように
・「。」で split する
・それぞれの個数をハッシュで数える
・ハッシュのデータを出力する
という方針でいくべきでしょうね.これ全体を while (<>) でくくればほぼんど OK.
    • good
    • 0
この回答へのお礼

ありがとうございます。
教えて頂いた方法で自分が実行したかった作業が行えるようになりました。

perlを始めて間もないので、勉強になりました。

お礼日時:2009/06/01 22:55

一部訂正


>$ perl split.pl ssample.txt sample2.txt
ではなくて
$ perl count.pl ssample.txt sample2.txt
だね。
「整形したテキストの行を集計する方法」の回答画像5
    • good
    • 0

No.2 ORUKA1951です。


きちんと、希望したいことを書いておかないとダメだよ。
他の可能性も含めて・・
sample.txt____________
あいうえお。かきくけこ。さしすせそ。たちつてと。あいうえお。
かきくけこ。さしすせそ。あいうえお。
らりるれろ
たちつてと。
らりるれろ。
sample2.txt___________
なにぬねの。ぱぴぷぺぽ。
あいうえお。
の複数のファイルがあり、しかも複数行にまたがっている可能性があるとき
・・ただし[。]以外の位置での改行は無いとする。(あれば、改行を取り除いてつないで処理すること)
・・そのかわり、例のように[。]が無くても処理してくれるはず

count.pl
#!/usr/local/bin/perl
@files = @ARGV;
foreach(@ARGV){
open IN,$_ ,or die;
while(<IN>){
@data = split /。/,$_;
while(<@data>){
$check{$_} ++;
if($check{$_}==1){push @out ,"$_";}
}
}
close IN;
}
open OUT ,">out.txt" or die;
while(<@out>){
print OUT "$_。$check{$_}\n";
}
close OUT;
__END__

使い方(Bashより)、Windowsの場合 > かな
$ perl split.pl ssample.txt sample2.txt
と、処理するファイルを幾つでも続けて書く。

[結果]
あいうえお。4
かきくけこ。2
さしすせそ。2
たちつてと。2
らりるれろ。2
なにぬねの。1
ぱぴぷぺぽ。1



★ポイントは、引数は@ARGVという環境変数に格納されるということ。

Bashシェルからの操作だが、Windowsだと一行目はいらないと思う。
    • good
    • 0
この回答へのお礼

ありがとうございます。

今後プログラムを発展させていくことを考えると、非常に参考になる回答を頂けました。
perlの勉強を深め、色々と試してみたいと思います。

お礼日時:2009/06/01 23:00

や, だから #2 と「標準入力から読み込む」を組合せるだけ, なんだけど.... 基本はハッシュかな? 例えば


my %count;
my @keys;
while (<>) {
chomp;
while (/[^。]*。/g) {
push @keys, $& unless $count{$&}++;
}
}
for my $key (@keys) {
print "$key $count{$key}\n";
}
みたいな感じ?
    • good
    • 0

ごく普通に・・


$line="あいうえお。かきくけこ。さしすせそ。たちつてと。あいうえお。";
split /。/,$line;
while(<@_>){
$check{$_} ++;
if($check{$_}==1){push @out ,"$_";}
}
while(<@out>){
print "$_。$check{$_}\n";
}

この回答への補足

すみません、私としては、

あいうえお。かきくけこ。さしすせそ。たちつてと。あいうえお。

をテキストデータとして保存してある状態で、コマンドプロンプト上で

>perl (整形・集計プログラム).pl (あいうえお…).txt

と入力して、結果を出力できるようにしたいです。
教えていただいたプログラムでも整形と集計は可能なのですが、できればこちらの形で作業を行いたいので、よろしくお願いします。

補足日時:2009/05/31 18:51
    • good
    • 0

「。

」は消えちゃうけど。

while(<>){
my @lines = split(/。/);
for ($i=0; $i<@lines; $i++){
#なんか集計
#結果表示
print "$lines[$i]\n";
}
}

とすれば、。ごとに処理が行える。

この回答への補足

「。」が無くなっての整形はできたのですが、行ごとの集計ができません。
#なんか集計
#結果表示
の部分に何か加える必要があるのでしょうか・・・?

補足日時:2009/05/31 19:04
    • good
    • 0

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