• ベストアンサー

perlでの特定文字列のカウント

ご教示お願いいたします。 perlについての質問です。 csvファイル内で、特定のカラムの中の、特定の文字列が何回出現するかマッチする回数をカウントしたいと考えています。 csvの中身は以下のような内容です。 yamada,20220522,jobA tanaka,20220521,jobB takahashi,20220521,jobB このcsvの最後のカラムに検索をかけ、「jobB」がいくつ出没するのかカウントしたいです。 この場合のスクリプトをどのように記述したらよいでしょうか? ワンライナーではなく、スクリプトファイルとしたいです。 以上、よろしくお願いします。

  • Perl
  • 回答数3
  • ありがとう数1

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

  • ベストアンサー
  • asciiz
  • ベストアンサー率70% (6642/9410)
回答No.3

あ、そういえば chop; ではなくて chomp; の方が良かったですね 各行の改行文字を削除したいだけなので。 chompしておかないと、csvが3カラムしかなかった場合にsplit後の$cols[2] が "jobB<改行>" となってしまうため、"jobB" と等しくない、とされてしまうのです。

neko883
質問者

お礼

ありがとうございます。 参考にさせて頂き、思う通りの結果が出力されました。 丁寧な解説で、大変良くわかる解答でした。

その他の回答 (2)

  • asciiz
  • ベストアンサー率70% (6642/9410)
回答No.2

>3カラム目、ユーザそれぞれのjob部分だけを検索し、カウントする場合 正規表現でマッチさせるか、ちゃんと各カラムに分割して判定するかでしょうね。 正規表現でやるなら判定部分をこんな感じに。※4カラム目以降が存在する必要あり。 $c++ if /^[^,]*,[^,]*,jobA,/ ちゃんとカラム分割するならば、 ---- count_jobB.pl ---- while(<>){ chop; @cols = split(/,/); $c++ if ($cols[2] eq "jobB"); } print $c ---- ここまで ---- こんな感じになります。

  • asciiz
  • ベストアンサー率70% (6642/9410)
回答No.1

「最後」なのか「3カラム目」なのかで少々書き方が変わってきますが。 「最後」だとこれで良いですかね。 ---- count_jobA.pl ---- while(<>){ $c++ if /,jobA$/ } print $c ---- ここまで ---- これを perl count_jobA.pl < csvファイル のようにして実行します。 なおこのスクリプトは「始めて使う変数は0」「行末セミコロンはセパレータなので区切りを認識できるところでは不要」を利用した、少しダーティーな書き方をしています。 さらに「改行は見やすさのためだけであるので無くてもいい」までやると、 perl -e "while(<>){$c++ if /,jobA$/}print $c" <count.csv というワンライナーでも実行できます。

neko883
質問者

補足

ありがとうございます。 追加なのですが… 3カラム目、ユーザそれぞれのjob部分だけを検索し、カウントする場合、どのような記述になるでしょうか?

関連するQ&A

  • エクセルで、特定の数字が出た回数をカウントする方法はありますでしょうか??

    いつも、いつもお世話になっております^ ^ エクセルで、特定の数字が出た回数を カウントする方法はありますでしょうか?? データ数が10000以上あるのですが、 その中から特定の数字が出た回数をカウントし、 別のセルにその数値を表示したいと思っております。 例)データ(Aセルに入力)   4   5   2   7   5   5   3   5  としましたら、  5と2を特定の数字とし、  Bセルに5と2が出た回数をカウントする方法は、  ありますでしょうか??  2が1回出現、  5が4回出現していますので、  この場合はB1セルに5と表示できればと思っております。 どなたか知識を分けていただければ幸いです。 よろしくお願いいたしますm(_ _)m

  • Perlで、文字の出現回数を調べたいのですが、

    Perlで、文字の出現回数を調べたいのですが、 どうすればよいのかわかりません。 while(<>){ s/あ/あ/g; } これを利用して、数えられないかと思ったのですが、 これだと無理ですよね。 1行に何度も出てくる文字も、ちゃんとカウントしたいのですが、 どのようにすればよいのでしょうか。 ご教示、お願い致します。

  • 文字列をカウントするにはどうすればいいのでしょうか?

    ファイル読み込み後その中の特定の文字列、「映画」の個数をカウントするというプログラムを次のように作ってみましたが、実際に起動してみるとエラーになります。何かわかる方がいれば教えてください。 #!/usr/local/bin/perl if (open(FH, "data/log.txt")) { @file = <FH>; close(FH); } foreach $count (@file){ $count = ($line =~ tr/映画/映画/); } print $count; exit;

    • ベストアンサー
    • CGI
  • 1ランナーで文字列が5フィールドの時文字置き換え

    perlの初心者です。 cshスクリプト内に、perlの1ライナースクリプトを入れて、文字の置き換えをしたいのですが、 記述の仕方が解りません教えてください。 【詳細】 テキストファイル内は、下記のようなデータが入っており、perlの1ライナーで文字列が 5フィールドのみMIYAKE_ILFをMIYAKE_ILFU  MIYAKE_HFをMIYAKE_HFU MIYAKE_LFをMIYAKE_LFUへ置き換えて、それ以外はそのまま出力したいのです。 130325.142626.281 #p 130325.142627 MIYAKE_ILF tanaka 130331.012203.576 #p 130331.012210 MIYAKE_HF tanaka 130428.132805.796 #p 130428.132809 MIYAKE_LF tanaka 130419.163411.369 #p 130419.163411 MIYAKE_HF tanaka  #f 13 04 19 16 34 10.565 34.08739 139.52408 1.377 0.2 0.018 0.020 0.042

    • ベストアンサー
    • Perl
  • Perl。文字出現回数を重複しないでカウントしたい。

    perl初心者です。どうぞ助けて下さい。 以下のようにデータがならんでいる時、 pphhhppphhhppppppphhppppppppppppppppppphhh pが連続した文字の連続数は 2、3、7、19 となります。 今、知りたいのはこのようなpの連続数の出現回数です。つまり、たとえばpが19回連続してあるものは何回でてきたか、が知りたいのです。 上の例だと1回が正解となります。 ところが、スクリプトを書くとき、 たとえば以下のようにしたとき、 pが19回なら重複カウントはなくても、 pを2でカウントしたら、 本当に出てきて欲しいこたえは一回なのに、 P=3、7、19のどれにも該当してしまいます。 #!/usr/bin/perl ; open(IN, "text1.txt") or die ; open(OUT, ">text1out.txt"); while(<IN>) { chomp ; if (/(\S+)/) { $name = $1 ; if ($name =~ /^ppppppppppppppppppp/) { {$count++;} ; } print OUT "$count\n" ; } } close (IN) ; close (OUT) ; 正規表現の中を工夫すればいいのだと思いますが、 大変困っております。宜しくお願いします。

    • ベストアンサー
    • Perl
  • substr_count() のPerl版

    substr_count() のPerl版はありますか? substr_count() のような関数をPerlで使いたいんです。 基本的に該当文字列の出現回数さえカウントできればいいんです。 誰か教えてください。

    • ベストアンサー
    • Perl
  • Perlで着メロDLカウント

    Perlで着メロをダウンロードさせカウントするスクリプトを書いたのですが、 J-PHONEでmmfファイルをダウンロードすると「REP310 J-PHONEではページを表示できません」というエラーが出てDLできません。 2000サーバーでIISのMIMEは既に登録済みです。 また、DoCoMoのmldは問題なくDLできカウントできます。 スクリプトはHTTP_USER_AGENTとホストで判定し、 J-PHONEの場合はHTTP_X_JPHONE_SMAFで和音数を調べて、 カウントしてからLocationでファイルの絶対パスへ飛ばしてます。 ちなみに、ケータイに直でパスを入れるとダウンロードできます。

    • ベストアンサー
    • Perl
  • perlの正規表現 (ワンライナー)

    以下のような文字列から2つの要素だけ抽出するようなperl/rubyのスクリプトはどのように書いたらいいでしょうか? できればワンライナーで実現したいです(が、ワンライナーとしてはちょっと複雑なのでしょうか。。。) 元の文字列 -test t001 +opt0=1024 -N n_paramX -seed 1 -test t002 +opt0=1024 -opt1=2486 -N n_paramY -test t003 +opt3=1234 -N n_paramZ ... 整形後の文字列 t001 n_paramX t002 n_paramY t003 n_praramZ ※ 各行に -test と -N が必ず存在していることは仮定してOKです スクリプトで記述した場合: while(<>) { /\-test (\S+)/; $match00 = $1; /\-N (\S+)/; $match01 = $1; print "$match00 $match01\n"; } よろしくお願いします

  • perlにて2つのファイル比較

    いつもお世話になっています。 今回perlで2つのCSVファイルを比較して、マッチしたものをエクセルで表示させるスクリプトを作ろうとしています。 エクセルに表示するときに、OLE32を使うことは前回教えていただいたのですが、2つのファイルを比較する方法が分かりません; ネットなどでは調べたのですが、参考になるサイトなど見つけられなかったので、詳しい方お力をお貸しください。 参考になりそうなサイトも教えていただけると、とても助かります。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • 特定の行を編集したい-perl

    特定の行を編集するプログラムを組んでいます。 どうしても2行だったものが1行になってしまいます。 1111,山田,2007/03/10 2222,田中,2007/04/09 3333,南,2007/06/01 ↓↓編集後 1111,山田,2007/03/10↑2222,田中,2007/04/09 3333,南,2007/06/01 になります。↑矢印が出現し2行だったのが1行になります。 スクリプトは、 &read_txt2; foreach (@txt) { # chomp $_; ($tonum, $name, $login) = split(/,/, $_); if ($tonum eq $mynum) { $login = &get_date_string; # $login .= "\n"; $_ = join(',', ($tonum, $name, $login)); } push(@all_txt, $_); } @txt = @all_txt; &write_txt2; Perl逆引き大全600と同じようなスクリプトなのですが・・・ 気になる点としては$loginが空っぽデータであることです。 関係あるでしょうか? 改行コードについてはchompで削除してみたりしたのですが、 駄目でした。変化なし。 ちなみにログイン時にログインした日時を更新していくスクリプトです。

    • ベストアンサー
    • CGI

専門家に質問してみよう