• 締切済み

文字列をグループ毎に集計する

集計を行いたいテキストデータとして、以下のようなものがあります。 あいうえお かきくけこ さしすせそ あいうえお かきくけこ EOS かきくけこ さしすせそ さしすせそ あいうえお さしすせそ EOS あいうえお かきくけこ かきくけこ かきくけこ さしすせそ EOS このデータに対して、EOSが出現するまでを一つのグループとして重複する文字列の集計を行いたいです。 EOS毎に繰り返し処理を行えば良いのではないかと考えてはいるのですが、そのプログラムがどうしても作れません。 最終的な集計結果としては、 あいうえお 2 かきくけこ 2 さしすせそ 1 さしすせそ 3 あいうえお 1 かきくけこ 1 かきくけこ 3 あいうえお 1 さしすせそ 1 というようにしたいです。 よろしくお願いします。

  • mtd15
  • お礼率38% (5/13)
  • Perl
  • 回答数2
  • ありがとう数0

みんなの回答

  • ryu_chan
  • ベストアンサー率37% (69/186)
回答No.2

こんな感じでいかかでしょうか? my %count_of; my @result; while ( my $line = <DATA> ) { chomp $line; if ( $line eq 'EOS' ) { push @result, {%count_of}; %count_of = (); } else { ++$count_of{$line}; } } for my $count_of (@result) { my @sorted_data = map "$_->[0] $_->[1]", sort { $b->[1] <=> $a->[1] or $a->[0] cmp $b->[0] } map [ $_, $count_of->{$_} ], keys %$count_of ; print join("\n", @sorted_data), "\n\n"; } __DATA__ あいうえお かきくけこ さしすせそ あいうえお かきくけこ EOS かきくけこ さしすせそ さしすせそ あいうえお さしすせそ EOS あいうえお かきくけこ かきくけこ かきくけこ さしすせそ EOS

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

BEGIN {初期化} while (<>) { if /^EOS$/) { 集計結果を出力する 初期化 } else { 集計 } } くらい?

関連するQ&A

  • 整形したテキストの行を集計する方法

    Perlでテキストデータの集計を行いたいのですが、集計のプログラムが上手く作れずに困っています。 元のテキストとして、 あいうえお。かきくけこ。さしすせそ。たちつてと。あいうえお。 というものがあり、整形プログラムとしては、 while(<>){ s/。/。\n/g; print"$_"; } があります。このプログラムを使って、 あいうえお。 かきくけこ。 さしすせそ。 たちつてと。 あいうえお。 という形に整形ところまではできたのですが、上記のプログラムに追加する形で、 あいうえお。 2 かきくけこ。 1 さしすせそ。 1 たちつてと。 1 というように同一の行の集計を行えるようにしたいです。 元のテキストデータから整形と集計を1つのプログラムで行えるようにしたいのですが、どうすれば良いのでしょうか?

    • ベストアンサー
    • Perl
  • javaScriptで、テキストエリアのある文字列を見つけて、

    javaScriptで、テキストエリアのある文字列を見つけて、 その行から、1行目と2行目を消すという処理を行いたいのですが、 コーディングがわかりません。 教えて下さい。 (例) 下記のテキストエリアから、「<ターゲット文字列>」を見つけて、 その行から1行目と2行目、つまりは、「さしすせそ」と「たちつてと」を削除したいです。 -----textarea----- あいうえお かきくけこ <ターゲット文字列> さしすせそ たちつてと

  • 文字列の集計

    添付のように、カンマでくぎられた文字列を集計するための 関数を教えてください。 =COUNTIF(D2,"=*a*)でやって失敗しました。 *データの個数を知りたいです。

  • 文字列のカウント

    お世話になります あの、 あいうえお かきくけこ さしすせそ という3組の文字列が有るとします そのそれぞれの組(あいうえおで1つ)を として数えるにはどうしたらいいのでしょうか? 例えば あいうえお+ かきくけこ+ さしすせそ=3 となるようにしたいのですが・・・

    • ベストアンサー
    • Perl
  • 文字列をランダムに並び替えるソフト

    入力した文字列をランダムに並び替えるツールを探しています。 例えば、テキスト内に あいうえお かきくけこ さしすせそたち つてとなにぬねの とある場合、そのファイルを読み込むと おえいあう きくかけこ すさしそちたせ つてなのにとねぬ のようにランダムに並び替えてテキスト形式などで出力してくれるようなものです。(行ごとにランダムに並び替える) http://www.forest.impress.co.jp/article/2004/03/19/okiniiri.html のようなソフトは見つけたのですが、並び替えたものが出力されるわけではないので使えませんでした。 自分でプログラムを組んだほうが早いのかもしれませんが、いかんせんプログラムの知識がまったくないのでできません・・・ もしこのようなツールがありましたらご紹介お願いします。

  • EXCEL集計(グループ毎に複数列内容の数量)

    EXCEL2010です。 画像のようなデータがあります。 やりたい事(1) 好物1~3の内容のそれぞれの数量を集計したい。 結果:いちご=3、メロン=2、、、というように やりたい事(2) 「属性」列のグループ毎(小学生、中学生、高校生)に、好物1~3の内容の数量を集計したい。 結果: 小学生:いちご=2、りんご=1 中学生:いちご=1、・・・ 高校生:・・・ どのように集計したらよいでしょうか。

  • 配列の中に重複文字列があるか否かをチェックしたいのですが、アルゴリズムを教えてください。

    配列10000個の中に次のように文字列が入っているとします。 (実際に使うのはもっとずっと長い文字列が配列内に格納されています。) Data_Array[1] = "GRZRMZCOMKMSG" Data_Array[2] = "DCUIROTLUMWBC" Data_Array[3] = "RGLBMILRPBSMY" . . . Data_Array[9998] = "RSKFDHAHMOESI" Data_Array[9999] = "AQVOXBVNILGOP" Data_Array[10000] = "YNYRUPEXYOGFN" 配列Data_Array[10000]の中に重複文字列がないか探索したいと考えています。 ~普段の手順~ 配列中身を一度テキストに吐き出し、そのテキストをExcelに貼り付ける。 そして、Excelのフィルタ機能で重複文字列を排除。 その後、重複文字列を排除した文字列を保存したものをテキストファイルに保存する。 それをプログラムで読み込んで配列内に格納してから次の処理を続ける といった、効率の悪い方法をとっています。 そこで、プログラム内で処理する方法を次のように考えてみました。 ~思いつく方法~ dim DataArrayTemp[10000] for i = 1 to 10000 flag = 0 // 重複文字がないかチェック for j = i+1 to 10000 ifb Data_Array[i] = Data_Array[j] then // 重複があった場合はflag = 1にする flag = 1 break // 内ループ脱出 endif next // flag = 0であれば重複がない項目 (flag = 1のときは、重複がある) ifb flag = 0 then DataArrayTemp[temp_i] = Data_Array[i] temp_i = temp_i + 1 endif next これは、力技なので配列内の量が多くなると計算時間がかかってしまいます。 ですので、重複しない文字列だけを抽出する効率の良い方法がありましたらどなたか知恵を貸してください。

  • WORD・VBA、文字列変換

    知っている人には簡単なプログラムと思いますが、 参考書籍がないので全く組めません。 プログラム全文を教えてください。 環境は、Windows7、WORD2010 です。 次のような3行の原文があったとします。 あいうえお か{きく}けこ さしすせそ この原文のうち、 か{きく}けこ の行だけ手動で反転させておきます。 この状態でプログラムを走らせます。 プログラムは一瞬で終了します。 そして、任意の場所、たとえば、原文の2行下にカーソルを手動でもってきて Ctrl+V で手動でペーストすると、次のような文章が出現するプログラムを組みたいのです。 あいうえお か{きく}けこ さしすせそ か{  }けこ つまり、反転した文字列だけをメモリに取り込み、 メモリ内に取り込んだその文字列だけをプログラムにより操作しますので、 原文は操作を受けずそのままです。 そして、プログラムの機能は、 メモリに取り込んだ文字列内にある中かっこ{ }の中の文字(この例では「き」と「く」)を 同じバイト数の空白で置換するということです。 追伸: どこかの出版社がWORD・VBAの書籍を出してくれたら、こんな簡単な質問をしなくても済むのですが・・・。全文を聞くことが情けないことは百も承知です。それでもやはり全文を教えて下さい。

  • エクセルのセル内重複データの処理について

    下記のような雪だるま式に増え続けるエクセルの 重複データの処理で困っています。 ただし重複部分を削除したデータの文字数は 一定ではありません。 A列 あいうえお あいうえおかきくけこ あいうえおかきくけこさしすせそ    ・    ・    ↓ あいうえお かきくけこ さしすせそ    ・    ・ 以上のように処理できないでしょうか。 よろしくご回答をお願いします。

  • 文字列の比較

    現在Cでプログラムをつくっているのですが いきずまってしまいました。 1.テキストファイルを読み込む 2.書き込みファイルを開く 3.読み込んだデータを一行読み込んで   その行の特定の文字列があれば、   特定の文字列のみ取り出し、   書き込みファイルに書く。    4.次以降の行も同じ処理をする。    5.読み込み、書き込みファイルを閉じる。 と、こんな感じのプログラムなのですが、 3の特定の文字列をどのように取り出せばいいのかわかりません。 取り出したいのが数字ならば、if文でできるのですが 文字列の場合は、どうなんでしょうか。 例えば、「MOJIRETU11」という取り出したいとき 数字と同じようにIF文を使用することは、できるのでしょうか。

専門家に質問してみよう