• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:整形したテキストの行を集計する方法)

Perlでテキストデータの集計を行う方法

このQ&Aのポイント
  • Perlでテキストデータの集計を行いたい場合、以下のプログラムを使用することで実現できます。
  • 元のテキストデータを整形するためには、`s/。/。 /g;`という正規表現の置換を行います。
  • 集計するためには、ハッシュを使用してテキストデータの行をカウントすることができます。

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

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

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

mtd15
質問者

お礼

ありがとうございます。 教えて頂いた方法で自分が実行したかった作業が行えるようになりました。 perlを始めて間もないので、勉強になりました。

その他の回答 (5)

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.5

一部訂正 >$ perl split.pl ssample.txt sample2.txt ではなくて $ perl count.pl ssample.txt sample2.txt だね。

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.4

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だと一行目はいらないと思う。

mtd15
質問者

お礼

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

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

や, だから #2 と「標準入力から読み込む」を組合せるだけ, なんだけど.... 基本はハッシュかな? 例えば my %count; my @keys; while (<>) { chomp; while (/[^。]*。/g) { push @keys, $& unless $count{$&}++; } } for my $key (@keys) { print "$key $count{$key}\n"; } みたいな感じ?

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.2

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

mtd15
質問者

補足

すみません、私としては、 あいうえお。かきくけこ。さしすせそ。たちつてと。あいうえお。 をテキストデータとして保存してある状態で、コマンドプロンプト上で >perl (整形・集計プログラム).pl (あいうえお…).txt と入力して、結果を出力できるようにしたいです。 教えていただいたプログラムでも整形と集計は可能なのですが、できればこちらの形で作業を行いたいので、よろしくお願いします。

  • ssk38
  • ベストアンサー率44% (22/49)
回答No.1

「。」は消えちゃうけど。 while(<>){ my @lines = split(/。/); for ($i=0; $i<@lines; $i++){ #なんか集計 #結果表示 print "$lines[$i]\n"; } } とすれば、。ごとに処理が行える。

mtd15
質問者

補足

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

関連するQ&A