Perlでテキストデータの集計を行いたいのですが、集計のプログラムが上手く作れずに困っています。
元のテキストとして、
あいうえお。かきくけこ。さしすせそ。たちつてと。あいうえお。
というものがあり、整形プログラムとしては、
while(<>){
s/。/。\n/g;
print"$_";
}
があります。このプログラムを使って、
あいうえお。
かきくけこ。
さしすせそ。
たちつてと。
あいうえお。
という形に整形ところまではできたのですが、上記のプログラムに追加する形で、
あいうえお。 2
かきくけこ。 1
さしすせそ。 1
たちつてと。 1
というように同一の行の集計を行えるようにしたいです。
元のテキストデータから整形と集計を1つのプログラムで行えるようにしたいのですが、どうすれば良いのでしょうか?
No.6ベストアンサー
- 回答日時:
えぇと....
<@data> とか <@out> とかで何をしたいのでしょうか>#4. こんなところでグロブする必要性は見えないのですが....
あと, @ARGV は Perl の変数であって「環境変数」じゃないよ. 環境変数は %ENV からアクセスする.
まあ #3 では変な方向に走ったけど, わかりやすくするなら #2 のように
・「。」で split する
・それぞれの個数をハッシュで数える
・ハッシュのデータを出力する
という方針でいくべきでしょうね.これ全体を while (<>) でくくればほぼんど OK.
ありがとうございます。
教えて頂いた方法で自分が実行したかった作業が行えるようになりました。
perlを始めて間もないので、勉強になりました。
No.5
- 回答日時:
一部訂正
>$ perl split.pl ssample.txt sample2.txt
ではなくて
$ perl count.pl ssample.txt sample2.txt
だね。
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だと一行目はいらないと思う。
ありがとうございます。
今後プログラムを発展させていくことを考えると、非常に参考になる回答を頂けました。
perlの勉強を深め、色々と試してみたいと思います。
No.3
- 回答日時:
や, だから #2 と「標準入力から読み込む」を組合せるだけ, なんだけど.... 基本はハッシュかな? 例えば
my %count;
my @keys;
while (<>) {
chomp;
while (/[^。]*。/g) {
push @keys, $& unless $count{$&}++;
}
}
for my $key (@keys) {
print "$key $count{$key}\n";
}
みたいな感じ?
No.2
- 回答日時:
ごく普通に・・
$line="あいうえお。かきくけこ。さしすせそ。たちつてと。あいうえお。";
split /。/,$line;
while(<@_>){
$check{$_} ++;
if($check{$_}==1){push @out ,"$_";}
}
while(<@out>){
print "$_。$check{$_}\n";
}
この回答への補足
すみません、私としては、
あいうえお。かきくけこ。さしすせそ。たちつてと。あいうえお。
をテキストデータとして保存してある状態で、コマンドプロンプト上で
>perl (整形・集計プログラム).pl (あいうえお…).txt
と入力して、結果を出力できるようにしたいです。
教えていただいたプログラムでも整形と集計は可能なのですが、できればこちらの形で作業を行いたいので、よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 3 2022/10/04 15:07
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- その他(コンピューター・テクノロジー) 50台の織機から回転数を取得・集計しモニターに表示したい 2 2022/11/05 15:48
- その他(プログラミング・Web制作) VBA 1 2023/01/19 16:19
- Excel(エクセル) SUMIFのIF分岐について 4 2023/04/15 12:57
- Excel(エクセル) Excel、同じフォルダ内のExcelファイルの特定シートのみを1つのファイルに集約したい 8 2022/09/07 15:12
- 統計学 確率統計の問題です。 3 2022/04/07 04:39
- HTML・CSS GETをPOSTに変更したところ 送信 不能です。 1 2022/04/10 17:31
- その他(健康・美容・ファッション) 耳穴型補聴器(中古品)の再整形 1 2022/06/07 18:49
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perl 重複カウント 上位3名
-
テキストファイルの各行を配列...
-
Pythonでegrep機能をつかいたい
-
「パスが見つかりません」とい...
-
Fortranで1行飛ばして読み込む方法
-
awkスクリプトでダブルクォーテ...
-
window.open でのファイル指定方法
-
ListBoxのデータを高速でファイ...
-
C言語で特定の行を抽出する方法...
-
ReadLineでの読み出し行を指定する
-
VBAでCSVファイルを途中行まで...
-
パスから最後のディレクトリだ...
-
ヒアドキュメントの書き方
-
Edge スクレイピング
-
ExcelをCSV書き出す場合のシー...
-
close()で例外が投げられる理由
-
CSVデータの編集の際の重複チェ...
-
Perlで特定行から特定行までを...
-
配列の中に重複文字列があるか...
-
オープンしたファイルで行の連結
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Pythonでegrep機能をつかいたい
-
テキストファイルの各行を配列...
-
ファイル名を複数個配列で確保...
-
Pythonで非日本語のUnicode文字...
-
「パスが見つかりません」とい...
-
ifstream/ofstream について
-
C++でのテキストファイル読み込...
-
perlでCSVをソートする方法につ...
-
Pythonでテキストを行数指定し...
-
perlで先頭の数値をみて昇順に...
-
VBScriptにて、テキストファイ...
-
一行だけ読込
-
perlで指定範囲を複数ファイル...
-
ファイル読み込みマッチングに...
-
Perl Grepについて
-
ifstream を利用した1行分のテ...
-
Visual Basicを使って三平方の...
-
perlの引数で複数のファイル処...
-
Perlによるディレクトリ内の連...
-
system関数と引数について
おすすめ情報