• ベストアンサー

投票データをハッシュを使用して入出力する

こんにちは。tyabudaiと申します。 アンケート(投票)のCGIを 作成しようと思っています。 ログの中身は、(とりあえずカンマ区切りで) 「項目,数値」です。 処理のイメージとしては、 まずログファイルの内容を、 「項目」をキーとしたハッシュに取り込みます。 投票があった場合、 「項目」をキーとして「数値」を取り出し、 1つ増加させる処理をしたいです。 現在、他サイト様よりCGIをダウンロードして そのような処理がないか探していますが、 全く手がかりがありません。 まずは、ログファイルの内容をハッシュに取り込む方法を お教えいただけないでしょうか。 ご存知の方のお力添えいただければ幸いです。

  • Perl
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2

> foreach (%hash) > { > print << "END"; > $key は $hash{$key} > <BR> > END > } ここが違います。正しくはこうなります。 foreach (keys %hash) { print << "END"; $_ は $hash{$_} <BR> END } なぜ最後のデータが表示されるのかというと、 > $key は $hash{$key} での $key には、 > while(<IN>) { > ($key,$val)=split(/,/,$_); > $hash{$key}=$val; > } で最後に参照した「ううう」が入っているため、毎回 $hash{'ううう'} が表示されるからです。 また、なぜ6回表示されるのかというと、これは %hash を > foreach (%hash) で、リストとして評価しているため、('あああ',2,'いいい',5,'ううう',10)というリストの要素の数(6個)分だけループするからです。 foreach やハッシュについての詳しい使い方などについては、参考書などを読んでみて下さい。

tyabudai
質問者

お礼

丁寧な解説ありがとうございます。 ようやく理解することができました。 大変助かりました。 これからもよろしくお願いいたします。

その他の回答 (1)

noname#25358
noname#25358
回答No.1

 普通に、 open(IN, "<..."); while(<IN>) {   ($key,$val)=split(/,/,$_);   $hash{$key}=$val; } close(IN);  とするのは駄目なんでしょうか?  このテクニックは方々で使われているものです。

tyabudai
質問者

お礼

回答いただきありがとうございました。 知識不足のためご教示いただいた内容を 理解するのに時間がかかってしまいました。 これからもよろしくお願いいたします。

tyabudai
質問者

補足

ありがとうございます。 練習で以下のような処理を組んでみたのですが、 うまく表示されません。 ログファイル:count.dat に、  あああ,2  いいい,5  ううう,10 というデータを書いてみました。 しかし、実行してみると  ううう は 10 が6回表示されます。 これはどこが間違っているのでしょうか? なぜ最後のデータを 6回繰り返すのかわかりません。 申し訳ないですがお教えいただけないでしょうか。 以下サンプル -------------------------------------- #!C:/Perl/bin/perl # ハッシュの練習です $file = "count.dat"; print "Content-type: text/html\n\n"; print << "END_HTML"; <HTML> <HEAD> <TITLE>TEST</TITLE> </HEAD> <BODY> ハッシュのテストです。<BR> END_HTML open(IN, "<$file") || die "Can't open $file"; while(<IN>) { ($key,$val)=split(/,/,$_); $hash{$key}=$val; } close(IN); # 全てのデータについて繰り返す foreach (%hash) { print << "END"; $key は $hash{$key} <BR> END } print "</BODY></HTML>"; ---------------------------------------

関連するQ&A

  • ハッシュとif文

    CGIを改造しようと何とかがんばってます。 ハッシュから確答するものを表示したいのですが、うまく出来ません。 まずは、別ファイルにリストを保存しています。 %jlist = ( 11 => '項目1', 12 => '項目2', 13 => '項目3', 14 => '項目4', ~~ ); そして、ログファイルには数字が保存されています。 $genre←11から99までの数字が保存 これをwhileで繰り返し表示するリストにちゃんと項目名を表示させたいのですが、うまく出来ません。 foreach $key (keys(%jlist)){  if($key eq $genre){  print "[$value]\n";  } } とてつもなく変なことをしているかもしれませんが、どのようにしたら解決できるか教えてください。

    • ベストアンサー
    • Perl
  • ハッシュテーブルの使い方

    こんにちわ。 いまVB.Net2003でプログラミングをしている者です。 ORACLEのあるテーブルの内容をハッシュテーブルに取り込んで, キー検索する処理をしたいのですが, 取り込む際,ハッシュテーブルの「Add」メソッドで 1件ずつ取り込むしかないのでしょうか? たとえばコンボボックスの「DataSource」プロパティに レコードセットを設定するように,一回で設定したいのですが, このような機能があるでしょうか? またハッシュテーブルはキーは1つしか設定できないようですが, このテーブルデータを2つのキーで検索するのはどうすれば 良いでしょうか?

  • このスクリプトを改造したいのですがアドバイス下さい。

    http://www.rescue.ne.jp/cgi/webvote/ このページにあるvote.cgiの改造をしようとしています。 通常の仕様ですと、投票され、投票数の多い順にソートされるようになっています。 私のやりたいことは、投票順でソートせずに項目名でソートもしくはまったくソートせず項目が登録された順に並ぶようにしたいのです。 136行目にsort命令があるのでここをいじればいけそうな感じがするのですが、どうもうまくいきません。 $_に項目名が収められているのはわかったのですが、ではそれでソートしようとするにはどうしたらよいのか。 そもそもソートはハッシュのキーを使ってやってるようなのですが、私の解読能力では「のようだ」止まりで先に進めません。 ヒントもしくはアドバイスをいただけないでしょうか?

    • ベストアンサー
    • CGI
  • ACCESSのクエリを使用してデータ更新したい

    Office2010のAccessを使用しています。 以下のようなことをしたいのですが、どのようにクエリを設定すればよいか教えてください。 処理内容は、FileAに対してKeyマッチするFileBの2項目に更新し、FileCを出力する。 FileA:メンテナンス前データ FileB:更新データ FileC:メンテナンス後データ FileA:固定長のテキストデータ Key(7桁)+金額1(8桁)+金額2(8桁)+区分(2桁) ※金額1(前ブランク埋めのカンマ編集) ※金額2(前ゼロ埋め) FileB:カンマ区切りのテキストデータ Key(7桁)+金額1(8桁)+金額2(8桁) 例) FileA 0000001 90,00000090000AA 0000002 90,00000090000AA 0000003 90,00000090000BB FileB 0000002,30000,30000 FileC 0000001 90,00000090000AA 0000002 30,00000030000AA 0000003 90,00000090000BB 初心者なもので、ハードコピーなどで図解解説があれば助かります。 よろしくお願いいたします。

  • テキストファイルをリードしグラフ化する手法

    カンマ区切りのテキストファイルを読み込み、列単位でグラフ化させたいと思っております。 ログファイルの形式はこのような感じです。(Hexで16bitカンマ区切り) FFFF,EEEE,DDDD,…,AAAA AABB,CCDD,EEFF,…,0000 … 1111,2222,3333,…,0AFF このようなファイルを読み込んで列単位で処理したいです。 2次元配列を使うのかななんて思ったりするのですが・・・ どういう手法で処理するのか筋道だけでも教えていただけますと助かります。 よろしくお願いいたします。

  • 杜甫々さんのgifcat.plをカンマ区切りでも画像連結させたい

    カウンター画像の出力などに使われる杜甫々さんが作成されたgifcat.pl ではGIF画像の連結を行ってくれますが その元となるログは<>区切りでなくてはなりません。 例えば、総数、昨日、今日のアクセス数を取ってくれるカウンターのログを見ると 5<>5<>0<>105<>2<>13<> こんな感じになっています。 この<>区切りを,(カンマ)区切りであっても画像連結ができるようにしたいのですがその修正箇所がどうしてもわかりません。 元となるCGIの方はカンマ区切りでログが書き込まれるようにしました。 どなたかご教授願います。

    • ベストアンサー
    • CGI
  • ハッシュ(単語数を数える) たのしいRuby

    たのしいRuby P252に掲載されていた、例題 「ハッシュ(単語数を数える)」の解説を読んでも 意味が分からなかったので教えてください。 ■例題word_count.rb 1:# 単語数のカウント 2: 3: count = Hash.new(0) 4: 5:## 単語の集計 6:while line = gets 7: words = line.split 8: words.each{|word| 9: count[word] += 1 10: } 11:end 12: 13:## 結果の出力 14:count.sort{|a,b| 15: a[1] <=> b[1] 16:}.each{|key, value| 17: print "#{key}: #{value}\n" 18} ■疑問1. 解説には、 # 3行目で出現回数を記録するハッシュcountを作ります。 # countは、キーが単語、値がその単語が出現した回数を表します。 と書かれているのですが、「キーが単語、値がその単語が出現した回数を表します」 の内容が理解できません。newしただけなのに、どうして、 キーと値の内容が決まるのでしょうか? ■疑問2. 解説には、 # 8行目からの繰り返しでは、それぞれの単語をキーにして、countから出現回数を取り出し、 # +1します。 と書かれているのですが、「count[word] += 1」 の内容が理解できません。 作成したハッシュcountと、getsメソッドで読み込み単語単位に分割した配列wordsとが、 どこで関連付けされているのかが、分かりません。 ■疑問3. 解説には、 # ruby word_count.rb README という形で、Rubyに同梱されているREADMEファイルの単語数を調べた 実行結果が掲載されているのですが、 そのときの具体的な処理の流れが分かりません。 「ruby word_count.rb README」と書くだけで、 処理の流れが、getsの所まできたとき、 自動的に指定ファイル名を判断し、 読み込みを始めるということなのでしょうか。

    • ベストアンサー
    • Ruby
  • c言語:ファイルの入出力

    2つの行列をファイルから読み込み、その積をファイルに出力するプログラムを 作りたいのですが、参考書を読んでもよくわからないので教えて頂きたいです。 テキストファイルの文字列のコピーなどは、参考書を見てできたのですが、 ファイル入出力を使った数値の計算がいまいち理解できませんでした。 注意点は以下の通りです。 ・ファイルはカンマ区切りのテキストファイルとし、入力ファイルはエクセルで作成。拡張子は.csv。 ・ファイル名はキーボードから入力できるようにする。 よろしくお願いします。

  • カンマ区切りのデータを処理する方法

    よろしくお願いします。 vb6.0 + oracle9i(oo4o)で開発しています。 元データの中には、カンマ区切り形式で全角・半角・ブランクありの可変長です。(テキストデータではありません) 例えば、 111bb,22222,333333,44bb 11,234bb,33bb,44     見たいなデータです。 カンマの数は変わりませんし、各項目自体にカンマはありえません。 この各項目を個々に取り込んで処理したいのですが... MID関数(MID$,MIDB)など色々試してみるのですが 対応しきれなくなってしまいました。 各項目に対してTRIMをかけて処理をしたいのですが、 良い方法はあるのでしょうか? カンマ間を一つの項目として判断でき、 TRIMがかけれれば一番よいのですが... 文字を一文字ずつ読んでいって、カンマを判断するしかないのでしょうか?

  • PHP+MySQL でのcsvファイルインポート

    PHP + MySQL で、他システムから出力されてきたcsvファイルをテーブルへインポートしたいと考えています。 LOAD DATA INFILE で取り込もうとしていますが、対象のcsvファイルの特徴のためにうまく行かず苦戦しています。 取り込みたいファイルは、以下のようになっています。  ・各フィールドが "(ダブルクォート) で囲まれている  ・各フィールドは ,(カンマ) で区切られている  ・金額の項目には、桁区切りのカンマが入っている  例) "0001","あああああ",…(中略)…,"105,000","100,000","5,000",…     コード 項目名            税込み  税抜き 消費税  というような形です。    困っているのは、金額に使われている、桁区切りのカンマの処理についてです。  目的としては、データベースへ取り込むときには 105,000 は 105000 として取り込めればいいのですが、他システムから、桁区切りがなされた状態でcsvが作成されてきています。 LOAD DATA INFILE test.csv INTO TABLE data_table FIELDS TERMINATED BY ',' ENCLOSED BY '\"' IGNORE 1 LINES;  各項目のダブルクォートはENCLOSED BY で、項目を分けるカンマはTERMINATED BYで処理できていると思うのですが、金額の区切りに使われているカンマと項目の区切りのカンマを区別させられずに苦戦しています。  事前にcsvを加工するのも考えてはいるのですが、なるべくcsvを加工せずにそのまま取込したいと思います。  何か、簡単に回避できる方法等があればご教示願います。  宜しくお願いします。

    • ベストアンサー
    • PHP