CGI-BBS > CGI > Perl > ある項目をキーにカウントしたいんですが・・・。


カレッヂ
カレッヂ


質問者 しろ  投稿日 2/22(木) 14:31:00
超初心者のしろです。お世話になっております。
Fromから取得してデータをテキストファイルに蓄積していき、
そのデータのある項目をキーにして何件あるかカウントしHTMLで表示したいのですが、
これがまたさっぱり分からなくて、頭を抱えてしまいました。
テキストのデータの中のキーにしようとしているデータは、漢字です。
なんだか、とても漠然とした質問のようですみません!
どんな方法が良いかどなたか教えていただけませんか。
回答者 羊相談員  [削除]  投稿日 2/22(木) 15:06:31
「簡易データベース」にヒット件数を表示する機能をつけたような感じのものでしょうか?
そうだとすると、

・データファイルに書き込む処理
・検索処理
・ヒット件数をカウントする処理
・検索結果を表示する処理
等にわかれますが
どのあたりがわからないのでしょうか?
質問者 しろ  [削除]  投稿日 2/22(木) 15:24:23
羊相談員さんこんにちは。返信ありがとうございます。
今出来ているのは、”データファイルに書き込む処理”までです。
その後に、データファイルを読み込んできて、”,”毎にデータを分割して、$変数に割り当てて・・・なんて事をしてみたんですけど・・・とんでもない検討違いの事をやっていたりするのでしょうか?
なるべく具体的に教えて頂けるととても助かります!

回答者 だいだ  [削除]  投稿日 2/22(木) 19:54:13
カンマで区切られたレコードであれば、こんな感じでカウントアップできるのでは…

# $word に代入した文字(「検索」)が、レコードの2番目の項目( $field2 )に
# 含まれていたらカウントアップする

$word = "検索";
$count = 0;
open INFILE, $infile;
while (INFILE){
    chop;
    ($field1, $field2, $field3) = split /,/,$_;
    if ( $field2 =~ /$word/ ){ $count++; }
}
close INFILE;
print "$wordを含むレコードの件数: $count件<br>\n";

ファイルに書き込む処理まではできているということですが、漢字をEUCに変換してから書き込まないと、正常に検索できない(かもしれない)ので注意してください。
うまくいくといいですね。
回答者 羊相談員  [削除]  投稿日 2/22(木) 22:31:28
単純に
簡易データベースに以下の2文を追加すれば件数の表示がされるようになります。

$cnt = $#NEW;
print "<p>検索結果:$cnt件</p>";


あと、文字コードの問題がありますが
これは結構ややこしいので
処理の流れが一通り理解できるようになってから
考慮するのがいいと思います。
質問者 しろ  [削除]  投稿日 2/26(月) 09:54:08
だいださん、羊相談員さん返信ありがどうございます。
だいださんに教えて頂いたやり方で、カウントすることが出来ました。
羊相談員さんが教えてくれたものが、できればと思ったのですが、”簡易データベース”というのがわからずまだ試していない状況です。
(無知過ぎてすみません!)
もうひとつ教えて頂ければと思うのですが、カウントしたい対象が複数の場合はどうしたら良いのでしょうか?
※ $word="検索"の"検索"の部分が複数あるのです。
何から何まで申し訳御座いません。(一応自分でも一生懸命考えてはいるのですが・・・。)
回答者 だいだ  [削除]  投稿日 2/26(月) 10:30:37
方法はいろいろあると思いますが、「二つの単語のいずれかを含む」なら、

    $word1="検索";
    $word2="けんさく";
...
        if ( $field2 =~ /[$word1]|[$word2]/ ){ $count++; }

こんな感じでしょうか。
がんばってください。
質問者 しろ  [削除]  投稿日 2/26(月) 10:41:32
だいださん度々ありがとうございます!
カウントしたい対象は、結構ありまして、22個あります。
他のやり方もみし良かったら教えていただければと思うのですが。
(すっかり頼ってしまってますね。)
回答者 だいだ  [削除]  投稿日 2/26(月) 19:21:35
質問の内容の理解が間違っていました。(^^;

aaaa,bbbb,cccc,1111
aaaa,bbbb,dddd,1111
aaaa,bbbb,cccc,1111
aaaa,bbbb,dddd,1111
aaaa,bbbb,eeee,1111

例えば、このようなファイルを読み込んで、3番目の項目に現れる内容毎に件数をカウントしたいということでした。

while (<INDILE>){
    chop;
    ($field1,$field2,$field3,$field4) = split /,/,$_;
    $count{$field3}++;
}

@keylist = keys %count;

foreach $data (@keylist){
    print "$data : $count{$data}\n";
}

こうやって、ハッシュを使うのが一般的すか?
回答者 羊相談員  [削除]  投稿日 2/27(火) 09:19:19
もしかして人気投票みたいな感じですか?
それならここでも配布されてますけど
ソースを理解するのは難しいです。

はじめてあれを見たとき「なんでこんなに短いスクリプトでこんなことができるんだ」って思いました。
回答者 だいだ  [削除]  投稿日 2/27(火) 15:27:55
情報ありがとうございます。
さっそく勉強してみます。
質問者 しろ  [削除]  投稿日 3/1(木) 08:14:38
だいださん、どうもありがとうございます!
ハッシュを使ってカウントする事ができました。
ハッシュなんて良いものがあるんですね。勉強になりました!!
羊相談員さんもありがとうございました。
これから、漢字をEUCに変換したり、ファイルにロックをかけたり、データをソー
トしたりetc・・・またお世話になることが有るかと思いますが、その時はよろしく
お願い致します。

このページは終了したので返信(回答)は書きこめません

Web裏技