週替わりランキング作成cgiを探しています

このQ&Aのポイント
  • 週替わりランキングを作成するためのcgiを探しています。1位〜10位まで表示項目が4つ以上表示されるものを希望しています。
  • 自動でも手動でも構いませんが、2つの項目はリンクを設けたいです。
  • cgiやhtmlなど、表示形式は問いません。perlやphpで希望に近い機能やスクリプトをご存じの方がいらっしゃれば、ご教示いただけると助かります。
回答を見る
  • ベストアンサー

ランキング作成

週替わりランキングを作成cgiを探しています。 1位~10位までで、表示項目が4つ以上表示されるものを探しています。 自動でなく、手動で構いません。 ただ、2項目のみどうしてもリンクを設けたいのです。 ┏━━┳━━━┳━━━┳━━━┳━━━┓ ┃1位┃AAA┃BBB┃CCC┃DDD┃ ┣━━╋━━━╋━━━╋━━━╋━━━┫ ┃2位┃AAA┃BBB┃CCC┃DDD┃ ┣━━╋━━━╋━━━╋━━━╋━━━┫ できれば、過去ログを見れるものであればいいのですが、過去ログはこだわりません cgi、htmlのどちらの表示でもかまいません。 perlかphpで希望する機能に近いもの、希望そのもののスクリプトをご存じの方がお られましたら、よろしくお願い致します。

  • CGI
  • 回答数6
  • ありがとう数4

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

  • ベストアンサー
  • Dpop
  • ベストアンサー率51% (279/544)
回答No.3

#1 です。 あまり、綺麗なソースではありませんが。。。 entry.cgi entry.thtml ranking.thml の3ファイルで1セットです。このファイルは全て、【日本語EUC】で保存する。と言う事を前提にしています。 entry.thtml, ranking.thtml の拡張子が変わっていますが、書き間違えではありません。必ず「.thtml」と指定してください。 HTML部分を、CGIから分離するために、HTML::Templateと言うモジュールを利用しています。このモジュールが無いため動作しない。と言う事は無いとは思いますが、必要であればサーバーの管理者に問い合わせてください。 インターフェースは、かなり手抜きです。 1. 起動すると、今週の日曜日の日付と、入力欄が表示されます。 2. 日付を指定して、データを打ち込み、「登録」をクリックすると、データが書き込まれます。(入力欄のチェックなどは、まったく行っていません。) 3. 日付を指定して、「読込」をクリックすると指定された日付のデータを読み込みます。修正して「登録」をクリックすると、データが更新されます。(日付が指定されていない。指定された日付のデータが存在しない場合には、エラーが表示されます。) 4. 「生成」をクリックすると、静的HTMLファイルが生成されます。(ファイル名は、$conf{'htmlfile'}の定義で決まっています。各ファイルへの自動リンク機能などはありません。) 5. 「リロード」は、エラーが表示された時、初期表示に戻すために用意してあります。 カスタマイズ entry.thtml, ranking.thtml は、基本的にHTMLの文法で書かれています。ですので、このファイルを修正して頂ければ、サイトのイメージに合う体裁を作る事ができます。 途中、<TMPL_VAR NAME=なんとか>, <TMPL_LOOP NAME=なんとか>と言う文字列がでてきますが、HTML::Template の機能により、CGI側から埋め込んでいるデータなので、この部分は修正しないでください。(周りのHTMLは自由に修正して大丈夫です。) 生成されるHTMLファイルのファイル名は、$conf{'htmlfile'}で指定しています。%y, %m, %dがそれぞれ、from日付の年, 月, 日に対応して埋め込まれます。 データが数週分存在すると、生成されるHTMLファイルも複数になります。 $conf{'keywords'}, $conf{'description'}, $conf{'pagename'} は、HTMLの<head>~</head>に埋め込む、キーワード, 概要, ページタイトルです。適当に埋め込んでください。 $max の値を変更すると、ランキング数が変わります。 その他機能については、ご自分で修正, 追加して頂くか、ご要望を頂けば修正しますが、来月(明日)より、年末まで少し忙しくなる予定なので、レスポンスが極端に遅くなる可能性があります。(例えば、週末だけ。とか。)ご了承下さい。 ----- ^^^ entry.cgi ^^^ ----- #!/usr/local/bin/perl use HTML::Template; use Jcode; use CGI; use strict; my($max, $datafile); my($cgi, %in); my($i, @rdata, %conf); $max = 10; $datafile = 'ranking.txt'; $conf{'keywords'} = ''; $conf{'description'} = ''; $conf{'pagename'} = ''; $conf{'htmlfile'} = 'ranking%y%m%d.html'; $cgi = new CGI; $in{'smode'} = $cgi->param('smode'); $in{'yy'} = $cgi->param('yy'); $in{'mm'} = $cgi->param('mm'); $in{'dd'} = $cgi->param('dd'); for ($i = 0; $i < $max; $i++) { $in{"item$i"} = $cgi->param("item$i"); $in{"itemurl$i"} = $cgi->param("itemurl$i"); $in{"maker$i"} = $cgi->param("maker$i"); $in{"value$i"} = $cgi->param("value$i"); } &readdatafile(\@rdata); if ($in{'smode'} eq '読込') { &dispday(\@rdata); } elsif ($in{'smode'} eq '登録') { &updatedatafile(\@rdata); &disp(); } elsif ($in{'smode'} eq '生成') { &makehtml(\@rdata); &disp(); } else { &disp(); } exit(0); sub disp { my($i, @entry_loop, $template); my($yy, $mm, $dd, $week); my(@mmax) = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); $template = HTML::Template->new(filename => 'entry.thtml'); ($yy, $mm, $dd, $week) = (localtime(time))[5, 4, 3, 6]; $yy += 1900; $mm++; if ($week != 0) { if (($yy % 4) == 0) { $mmax[1] = 29; if (($yy % 100) == 0) { $mmax[1] = 28; if (($yy % 400) == 0) { $mmax[1] = 29; } } } $dd -= $week; if ($dd < 0) { $mm--; if ($mm == 0) { $yy--; $mm = 12; } $dd += $mmax[$mm-1]; } } $template->param(YY => $yy); $template->param(MM => $mm); $template->param(DD => $dd); for ($i = 0; $i < $max; $i++) { my(%row); $row{'RANK'} = $i+1; $row{'ITEM'} = qq|<input type="text" name="item$i" size="40">|; $row{'ITEMURL'} = qq|<input type="text" name="itemurl$i" size="80">|; $row{'MAKER'} = qq|<input type="text" name="maker$i" size="20">|; $row{'VALUE'} = qq|<input type="text" name="value$i" size="7">|; push(@entry_loop, \%row); } $template->param(ENTRY_LOOP => \@entry_loop); $template->param(KEYWORDS => $conf{'keywords'}); $template->param(DESCRIPTION => $conf{'description'}); $template->param(PAGENAME => $conf{'pagename'}); print "Content-Type: text/html\n\n"; print $template->output; } sub dispday { my($rdata) = @_; my($i, $ymd, @d, @entry_loop, $template); $template = HTML::Template->new(filename => 'entry.thtml'); if (($in{'yy'} eq '') || ($in{'mm'} eq '') || ($in{'dd'} eq '')) { $template->param(ERROR => '日付が入力されていません。'); } $ymd = join('/', $in{'yy'}, $in{'mm'}, $in{'dd'}); for ($i = 0; $i <= scalar(@{$rdata})-1; $i++) { if ($rdata[$i]->{'from'} eq $ymd) { $d[$rdata[$i]->{'rank'}-1] = $rdata[$i]; } } if (scalar(@d) == 0) { $template->param(ERROR => '指定された日付のデータはありません。'); } else { $template->param(YY => $in{'yy'}); $template->param(MM => $in{'mm'}); $template->param(DD => $in{'dd'}); for ($i = 0; $i < $max; $i++) { my(%row); $row{'RANK'} = $i+1; $row{'ITEM'} = qq|<input type="text" name="item$i" size="40" | . qq|value="|. $d[$i]->{'item'}. qq|">|; $row{'ITEMURL'} = qq|<input type="text" name="itemurl$i" size="80" | . qq|value="|. $d[$i]->{'itemurl'}. qq|">|; $row{'MAKER'} = qq|<input type="text" name="maker$i" size="20" | . qq|value="|. $d[$i]->{'maker'}. qq|">|; $row{'VALUE'} = qq|<input type="text" name="value$i" size="7" | . qq|value="|. $d[$i]->{'value'}. qq|">|; push(@entry_loop, \%row); } $template->param(ENTRY_LOOP => \@entry_loop); } $template->param(KEYWORDS => $conf{'keywords'}); $template->param(DESCRIPTION => $conf{'description'}); $template->param(PAGENAME => $conf{'pagename'}); print "Content-Type: text/html\n\n"; print $template->output; } sub makehtml($) { my($rdata) = @_; my($i, %d, $day); my($yy, $mm, $dd); my($template, $htmlfile, @fd, @td, @entry_loop); for ($i = 0; $i <= scalar(@{$rdata})-1; $i++) { $d{$rdata[$i]->{'from'}}[$rdata[$i]->{'rank'}-1] = $rdata[$i]; } foreach $day (sort keys %d) { (@fd) = split(m|/|, $d{$day}[0]->{'from'}); (@td) = split(m|/|, $d{$day}[0]->{'to'}); $htmlfile = $conf{'htmlfile'}; $yy = sprintf("%04d", $fd[0]); $mm = sprintf("%02d", $fd[1]); $dd = sprintf("%02d", $fd[2]); $htmlfile =~ s/%y/$yy/g; $htmlfile =~ s/%m/$mm/g; $htmlfile =~ s/%d/$dd/g; $template = HTML::Template->new(filename => 'ranking.thtml'); $template->param(FROMDAY => sprintf("%4d年%2d月%2d日", @fd)); $template->param(TODAY => sprintf("%4d年%2d月%2d日", @td)); @entry_loop = (); for ($i = 0; $i < $max; $i++) { my(%row); $row{'RANK'} = $i+1; $row{'ITEM'} = qq|<a target="_blank" | . qq|href="|. $d{$day}[$i]->{'itemurl'}. qq|"| . qq|title="|. $d{$day}[$i]->{'item'}. qq|">| . $d{$day}[$i]->{'item'} . qq|</a>|; $row{'MAKER'} = $d{$day}[$i]->{'maker'}; $row{'VALUE'} = $d{$day}[$i]->{'value'}; push(@entry_loop, \%row); } $template->param(ENTRY_LOOP => \@entry_loop); open(HTML, "> $htmlfile") || die("Panic! open error $htmlfile"); print HTML $template->output(). "\n"; close(HTML); } } sub readdatafile($) { my($rdata) = @_; my($from, $rank, $item, $itemurl, $maker, $value); if (-f $datafile) { open(IN, $datafile) || die("Panic! open error $datafile"); while(<IN>) { chop; ($from, $rank, $item, $itemurl, $maker, $value) = split(m/<>/); my(%d); $d{'from'} = $from; $d{'to'} = &add7day($from); $d{'rank'} = $rank; $d{'item'} = $item; $d{'itemurl'} = $itemurl; $d{'maker'} = $maker; $d{'value'} = $value; push(@{$rdata}, \%d); } close(IN); } } sub updatedatafile($) { my($rdata) = @_; my($ymd, $i, @work, $line); $ymd = join('/', $in{'yy'}, $in{'mm'}, $in{'dd'}); for ($i = 0; $i <= scalar(@{$rdata}-1)-1; $i++) { if ($rdata[$i]->{'from'} ne $ymd) { push(@work, $rdata[$i]); } } for ($i = 0; $i < $max; $i++) { my(%d); $d{'from'} = $ymd; $d{'rank'} = $i+1; $d{'item'} = $in{"item$i"}; $d{'itemurl'} = $in{"itemurl$i"}; $d{'maker'} = $in{"maker$i"}; $d{'value'} = $in{"value$i"}; push(@work, \%d); } @work = sort sortsub @work; open(OUT, "> $datafile") || die("Panic! open error $datafile"); for ($i = 0; $i <= scalar(@work)-1; $i++) { $line = join('<>', $work[$i]->{'from'} , $work[$i]->{'rank'} , $work[$i]->{'item'} , $work[$i]->{'itemurl'} , $work[$i]->{'maker'} , $work[$i]->{'value'}); print OUT $line. "\n"; } close(OUT); } sub sortsub { $a->{'from'} cmp $b->{'from'} || $a->{'rank'} <=> $b->{'rank'}; } sub add7day($) { my($day) = @_; my($y, $m, $d); my(@max) = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); if (($y % 4) == 0) { $max[1] = 29; if (($y % 100) == 0) { $max[1] = 28; if (($y % 400) == 0) { $max[1] = 29; } } } ($y, $m, $d) = split(m|/|, $day); $d += 7; if ($max[$m-1] < $d) { $d -= $max[$m-1]; $m++; if ($m == 12) { $m = 0; $y++; } } $day = join('/', $y, $m, $d); ($day); } ----- $$$ entry.cgi $$$ ----- ----- ^^^ entry.thtml ^^^ ----- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> <meta name="keywords" content="<TMPL_VAR NAME="KEYWORDS">"> <meta name="description" content="<TMPL_VAR NAME="DESCRIPTION">"> <title><TMPL_VAR NAME="PAGENAME"></title> </head> <body> <div align="left"> <form action="entry.cgi" method="post"> <font color="#ff0000"> <TMPL_VAR NAME=ERROR> </font> <p align="left"> <input type="text" name="yy" size="4" value="<TMPL_VAR NAME=YY>">年 <input type="text" name="mm" size="2" value="<TMPL_VAR NAME=MM>">月 <input type="text" name="dd" size="2" value="<TMPL_VAR NAME=DD>">日 </p> <table border="1"> <tr> <th align="center">順位</th> <th align="center">商品名</th> <th align="center">商品URL</th> <th align="center">メーカー</th> <th align="center">在庫数</th> </tr> <TMPL_LOOP NAME=ENTRY_LOOP> <tr> <td align="right"><TMPL_VAR NAME=RANK></td> <td align="left"><TMPL_VAR NAME=ITEM></td> <td align="left"><TMPL_VAR NAME=ITEMURL></td> <td align="left"><TMPL_VAR NAME=MAKER></td> <td align="left"><TMPL_VAR NAME=VALUE></td> </tr> </TMPL_LOOP> </table> <p align="center"> <input type="submit" value="読込" name="smode">  <input type="submit" value="登録" name="smode">  <input type="submit" value="生成" name="smode">  <input type="submit" value="リロード" name="smode"> </p> </div> </form> </body> </html> ----- $$$ entry.thtml $$$ ----- ----- ^^^ ranking.thtml ^^^ ----- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> <meta name="keywords" content="<TMPL_VAR NAME="KEYWORDS">"> <meta name="description" content="<TMPL_VAR NAME="DESCRIPTION">"> <title><TMPL_VAR NAME="PAGENAME"></title> </head> <body> <p align="center"> <TMPL_VAR NAME=FROMDAY>~<TMPL_VAR NAME=TODAY>のランキング </p> <div align="center"> <table border="1"> <tr> <th align="center">順位</th> <th align="center">商品名</th> <th align="center">メーカー</th> <th align="center">在庫数</th> </tr> <TMPL_LOOP NAME=ENTRY_LOOP> <tr> <td align="right"><TMPL_VAR NAME=RANK></td> <td align="left"><TMPL_VAR NAME=ITEM></td> <td align="left"><TMPL_VAR NAME=MAKER></td> <td align="right"><TMPL_VAR NAME=VALUE></td> </tr> </TMPL_LOOP> </table> </div> </body> </html> ----- $$$ ranking.thtml $$$ -----

ttoottoorroo
質問者

補足

度々のご返信ありがとうございました まさか作成してもらえるとは思いませんでした… 設置したのですが500のエラーが発生してしまい、perlチェッカーで調べてみた所、、どうもHTML::Templateモジュールがないようでした 専用サーバーの為、インストールするには自分でおこなわなければならない事と、telnetでsuでのログインするには実家から接続しなければならない事ですぐに対応ができません… サーバー管理会社に、事務所から接続するホスト名を伝えればなんとかなるので、さきほど事務所から作業できるように手配しました なんとか、HTML::Templateモジュールのインストールをがんばってみます。 また、ご報告させて頂きます。 本当にありがとうございました。

その他の回答 (5)

  • Dpop
  • ベストアンサー率51% (279/544)
回答No.6

再び Dpop です。 add6dayですが(以前は、add7day でした。)、7を足してしまうと次の日曜日になってしまうので、6を足すように変更してあります。 書き忘れました。 ついでに。項目を増やす程度なら、誰でもできます。 qq|| と言う表現が良くでてきますが、""と同じ意味です。単にその文字列の中でダブルクォーテーションを使いたく、\"\"とするのが面倒だったので、qq||で代用しただけの事です。 ■entry.cgi ●パラメータを受け取る部分。 for ($i = 0; $i < $max; $i++) { $in{"item$i"} = $cgi->param("item$i"); $in{"itemurl$i"} = $cgi->param("itemurl$i"); $in{"maker$i"} = $cgi->param("maker$i"); $in{"makerurl$i"} = $cgi->param("makerurl$i"); $in{"value$i"} = $cgi->param("value$i"); } の部分に、受け取りたいパラメータを追加します。(本日、makerurl$i(makerurl + 行番号と言う名前。)を追加しましたが、こんな要領です。) ●disp処理 for ($i = 0; $i < $max; $i++) { my(%row); $row{'RANK'} = $i+1; $row{'ITEM'} = qq|<input type="text" name="item$i" size="30">|; $row{'ITEMURL'} = qq|<input type="text" name="itemurl$i" size="50">|; $row{'MAKER'} = qq|<input type="text" name="maker$i" size="20">|; $row{'MAKERURL'} = qq|<input type="text" name="maker$i" size="50">|; $row{'VALUE'} = qq|<input type="text" name="value$i" size="7">|; push(@entry_loop, \%row); } entry.thtmlに引き渡す<input>タグを作っている部分です。$row{''}の中身は、必ず半角英数字の大文字で記述してください。name=""の部分は、$row{''}の中身と同じ物を小文字で記載し、その脇に$iを付けてください。順位毎に別々のパラメータを受けるための工夫です。 ●dispday処理 for ($i = 0; $i < $max; $i++) { my(%row); $row{'RANK'} = $i+1; $row{'ITEM'} = qq|<input type="text" name="item$i" size="30" | . qq|value="|. $d[$i]->{'item'}. qq|">|; $row{'ITEMURL'} = qq|<input type="text" name="itemurl$i" size="50" | . qq|value="|. $d[$i]->{'itemurl'}. qq|">|; $row{'MAKER'} = qq|<input type="text" name="maker$i" size="20" | . qq|value="|. $d[$i]->{'maker'}. qq|">|; $row{'MAKERURL'} = qq|<input type="text" name="makerurl$i" size="50" | . qq|value="|. $d[$i]->{'makerurl'}. qq|">|; $row{'VALUE'} = qq|<input type="text" name="value$i" size="7" | . qq|value="|. $d[$i]->{'value'}. qq|">|; push(@entry_loop, \%row); } disp処理とほぼ同じです。データファイルの中身を利用したい時には、$d[$i]->{'なんとか'}と書いてください。 ●makehtml処理 for ($i = 0; $i < $max; $i++) { my(%row); $row{'RANK'} = $i+1; $row{'ITEM'} = qq|<a target="_blank" | . qq|href="|. $d{$day}[$i]->{'itemurl'}. qq|"| . qq|title="|. $d{$day}[$i]->{'item'}. qq|">| . $d{$day}[$i]->{'item'} . qq|</a>|; $row{'MAKER'} = qq|<a target="_blank" | . qq|href="|. $d{$day}[$i]->{'makerurl'}. qq|"| . qq|title="|. $d{$day}[$i]->{'maker'}. qq|">| . $d{$day}[$i]->{'maker'} . qq|</a>|; $row{'VALUE'} = $d{$day}[$i]->{'value'}; push(@entry_loop, \%row); } 固定HTMLに埋め込む表の部分です。disp処理とほぼ同じです。データファイルの中身を使いたい時には、$d{$day}[$i]->{'なんとか'}と書いてください。 ●readdatafile処理 my($from, $rank, $item, $itemurl, $maker, $makerurl, $value); データファイルに記録されているデータを格納するための変数を定義しています。項目を追加したら、対応する変数名を追加してください。 ($from, $rank, $item, $itemurl, $maker, $makerurl, $value) = split(m/,/, $line); 上で指定した変数名を追加してください。この追加する位置は、updatedatafile処理と同じ場所である必要があります。 $d{'from'} = $from; $d{'to'} = &add6day($from); $d{'rank'} = $rank; $d{'item'} = $item; $d{'itemurl'} = $itemurl; $d{'maker'} = $maker; $d{'makerurl'} = $makerurl; $d{'value'} = $value; 単純に、$d{'なんとか'} = $なんとか; です。上記で追加した変数名から類推して指定します。 ●updatedatafile処理 for ($i = 0; $i < $max; $i++) { my(%d); $d{'from'} = $ymd; $d{'rank'} = $i+1; $d{'item'} = $in{"item$i"}; $d{'itemurl'} = $in{"itemurl$i"}; $d{'maker'} = $in{"maker$i"}; $d{'makerurl'} = $in{"makerurl$i"}; $d{'value'} = $in{"value$i"}; push(@work, \%d); } 入力されたパラメータをデータに追加する処理です。readdatafile処理と同様に追加してください。 for ($i = 0; $i <= scalar(@work)-1; $i++) { $line = join(',', $work[$i]->{'from'} , $work[$i]->{'rank'} , $work[$i]->{'item'} , $work[$i]->{'itemurl'} , $work[$i]->{'maker'} , $work[$i]->{'makerurl'} , $work[$i]->{'value'}); # どうしても、SJISで保存した場合には、次のコメントを取ってください。 # $line = Jcode->new($line)->sjis; print OUT $line. "\n"; } データファイルへ書き込む部分です。join関数の中に、, $work[$i]->{'なんとか'}と追加してください。この追加位置と、readdatafileのsplitの位置が同じである必要があります。 ■entry.thtml <table border="1"> <tr> <th align="center">順位</th> <th align="center">商品名</th> <th align="center">商品URL</th> <th align="center">メーカー</th> <th align="center">メーカーURL</th> <th align="center">在庫数</th> </tr> <TMPL_LOOP NAME=ENTRY_LOOP> <tr> <td align="right"><TMPL_VAR NAME=RANK></td> <td align="left"><TMPL_VAR NAME=ITEM></td> <td align="left"><TMPL_VAR NAME=ITEMURL></td> <td align="left"><TMPL_VAR NAME=MAKER></td> <td align="left"><TMPL_VAR NAME=MAKERURL></td> <td align="left"><TMPL_VAR NAME=VALUE></td> </tr> </TMPL_LOOP> </table> データ入力画面を作っている部分です。項目名と、入力領域を追加してください。<TMPM_VAR NAME=なんとか>は、追加した変数名から$を取って大文字にした物を指定してください。 ■ranking.thtml <div align="center"> <table border="1"> <tr> <th align="center">順位</th> <th align="center">商品名</th> <th align="center">メーカー</th> <th align="center">在庫数</th> </tr> <TMPL_LOOP NAME=ENTRY_LOOP> <tr> <td align="right"><TMPL_VAR NAME=RANK></td> <td align="left"><TMPL_VAR NAME=ITEM></td> <td align="left"><TMPL_VAR NAME=MAKER></td> <td align="right"><TMPL_VAR NAME=VALUE></td> </tr> </TMPL_LOOP> </table> </div> 静的HTML用の表部分です。entry.thtmlと同様です。静的HTMLの場合、アンカータグ部分はCGI側で編集してしまうので、なんとかURLの様な物は追加してはなりません。(CGI側のmakehtmlで編集してください。) 頑張ってくださいね(^_^)

  • Dpop
  • ベストアンサー率51% (279/544)
回答No.5

Dpop です。 あー。申し訳ない!! Jcode は使おうと思って use したのですが、結局使わなかったのです(^_^;;) 別のCGIを利用する時、利用するかも知れないので、良し。と言う事にしてください(^_^;;) > ただ、商品名へのリンクはできたのですが、メーカーサイトへのリンクができていなかったので、これから少し手を入れていきたいと思うのですが少し不安です… これについては、機能を追加しました。そのため、データフォーマットが変更になりますので、注意してください。 > 保存されたcsvを見てみたら、日本語が文字化けしてしまっています… それは、違います。正しく保存されています。 初めにも書きましたが、全て「日本語EUC」で保存する。と言う事を前提としています。 ですので、日本語EUCを利用できるエディタで、開いていただければ問題なく確認できます。 UNIXの世界では、漢字コードは日本語EUCで保存します。一部の文字の文字化けを防ぐために必要な処置となります。 そのリスクがある事を承知で、どうしてもSJISで保存したい場合には、readdatafile, updatedatafile のコメントを外してください。(Jcodeの行です。) この部分については、テストしていませんが、まぁ問題無いでしょう。 ranking.thtml には修正がありませんが、念のため3ファイルともアップしておきます。 ----- ^^^ entry.cgi ^^^ ----- #!/usr/local/bin/perl use HTML::Template; use Jcode; use CGI; use strict; my($max, $datafile); my($cgi, %in); my($i, @rdata, %conf); $max = 10; $datafile = 'ranking.csv'; $conf{'keywords'} = ''; $conf{'description'} = ''; $conf{'pagename'} = ''; $conf{'htmlfile'} = 'ranking%y%m%d.html'; $cgi = new CGI; $in{'smode'} = $cgi->param('smode'); $in{'yy'} = $cgi->param('yy'); $in{'mm'} = $cgi->param('mm'); $in{'dd'} = $cgi->param('dd'); for ($i = 0; $i < $max; $i++) { $in{"item$i"} = $cgi->param("item$i"); $in{"itemurl$i"} = $cgi->param("itemurl$i"); $in{"maker$i"} = $cgi->param("maker$i"); $in{"makerurl$i"} = $cgi->param("makerurl$i"); $in{"value$i"} = $cgi->param("value$i"); } &readdatafile(\@rdata); if ($in{'smode'} eq '読込') { &dispday(\@rdata); } elsif ($in{'smode'} eq '登録') { &updatedatafile(\@rdata); &disp(); } elsif ($in{'smode'} eq '生成') { &makehtml(\@rdata); &disp(); } else { &disp(); } exit(0); sub disp { my($i, @entry_loop, $template); my($yy, $mm, $dd, $week); my(@mmax) = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); $template = HTML::Template->new(filename => 'entry.thtml'); ($yy, $mm, $dd, $week) = (localtime(time))[5, 4, 3, 6]; $yy += 1900; $mm++; if ($week != 0) { if (($yy % 4) == 0) { $mmax[1] = 29; if (($yy % 100) == 0) { $mmax[1] = 28; if (($yy % 400) == 0) { $mmax[1] = 29; } } } $dd -= $week; if ($dd < 0) { $mm--; if ($mm == 0) { $yy--; $mm = 12; } $dd += $mmax[$mm-1]; } } $template->param(YY => $yy); $template->param(MM => $mm); $template->param(DD => $dd); for ($i = 0; $i < $max; $i++) { my(%row); $row{'RANK'} = $i+1; $row{'ITEM'} = qq|<input type="text" name="item$i" size="30">|; $row{'ITEMURL'} = qq|<input type="text" name="itemurl$i" size="50">|; $row{'MAKER'} = qq|<input type="text" name="maker$i" size="20">|; $row{'MAKERURL'} = qq|<input type="text" name="maker$i" size="50">|; $row{'VALUE'} = qq|<input type="text" name="value$i" size="7">|; push(@entry_loop, \%row); } $template->param(ENTRY_LOOP => \@entry_loop); $template->param(KEYWORDS => $conf{'keywords'}); $template->param(DESCRIPTION => $conf{'description'}); $template->param(PAGENAME => $conf{'pagename'}); print "Content-Type: text/html\n\n"; print $template->output; } sub dispday { my($rdata) = @_; my($i, $ymd, @d, @entry_loop, $template); $template = HTML::Template->new(filename => 'entry.thtml'); if (($in{'yy'} eq '') || ($in{'mm'} eq '') || ($in{'dd'} eq '')) { $template->param(ERROR => '日付が入力されていません。'); } $ymd = join('/', $in{'yy'}, $in{'mm'}, $in{'dd'}); for ($i = 0; $i <= scalar(@{$rdata})-1; $i++) { if ($rdata[$i]->{'from'} eq $ymd) { $d[$rdata[$i]->{'rank'}-1] = $rdata[$i]; } } if (scalar(@d) == 0) { $template->param(ERROR => '指定された日付のデータはありません。'); } else { $template->param(YY => $in{'yy'}); $template->param(MM => $in{'mm'}); $template->param(DD => $in{'dd'}); for ($i = 0; $i < $max; $i++) { my(%row); $row{'RANK'} = $i+1; $row{'ITEM'} = qq|<input type="text" name="item$i" size="30" | . qq|value="|. $d[$i]->{'item'}. qq|">|; $row{'ITEMURL'} = qq|<input type="text" name="itemurl$i" size="50" | . qq|value="|. $d[$i]->{'itemurl'}. qq|">|; $row{'MAKER'} = qq|<input type="text" name="maker$i" size="20" | . qq|value="|. $d[$i]->{'maker'}. qq|">|; $row{'MAKERURL'} = qq|<input type="text" name="makerurl$i" size="50" | . qq|value="|. $d[$i]->{'makerurl'}. qq|">|; $row{'VALUE'} = qq|<input type="text" name="value$i" size="7" | . qq|value="|. $d[$i]->{'value'}. qq|">|; push(@entry_loop, \%row); } $template->param(ENTRY_LOOP => \@entry_loop); } $template->param(KEYWORDS => $conf{'keywords'}); $template->param(DESCRIPTION => $conf{'description'}); $template->param(PAGENAME => $conf{'pagename'}); print "Content-Type: text/html\n\n"; print $template->output; } sub makehtml($) { my($rdata) = @_; my($i, %d, $day); my($yy, $mm, $dd); my($template, $htmlfile, @fd, @td, @entry_loop); for ($i = 0; $i <= scalar(@{$rdata})-1; $i++) { $d{$rdata[$i]->{'from'}}[$rdata[$i]->{'rank'}-1] = $rdata[$i]; } foreach $day (sort keys %d) { (@fd) = split(m|/|, $d{$day}[0]->{'from'}); (@td) = split(m|/|, $d{$day}[0]->{'to'}); $htmlfile = $conf{'htmlfile'}; $yy = sprintf("%04d", $fd[0]); $mm = sprintf("%02d", $fd[1]); $dd = sprintf("%02d", $fd[2]); $htmlfile =~ s/%y/$yy/g; $htmlfile =~ s/%m/$mm/g; $htmlfile =~ s/%d/$dd/g; $template = HTML::Template->new(filename => 'ranking.thtml'); $template->param(FROMDAY => sprintf("%4d年%2d月%2d日", @fd)); $template->param(TODAY => sprintf("%4d年%2d月%2d日", @td)); @entry_loop = (); for ($i = 0; $i < $max; $i++) { my(%row); $row{'RANK'} = $i+1; $row{'ITEM'} = qq|<a target="_blank" | . qq|href="|. $d{$day}[$i]->{'itemurl'}. qq|"| . qq|title="|. $d{$day}[$i]->{'item'}. qq|">| . $d{$day}[$i]->{'item'} . qq|</a>|; $row{'MAKER'} = qq|<a target="_blank" | . qq|href="|. $d{$day}[$i]->{'makerurl'}. qq|"| . qq|title="|. $d{$day}[$i]->{'maker'}. qq|">| . $d{$day}[$i]->{'maker'} . qq|</a>|; $row{'VALUE'} = $d{$day}[$i]->{'value'}; push(@entry_loop, \%row); } $template->param(ENTRY_LOOP => \@entry_loop); open(HTML, "> $htmlfile") || die("Panic! open error $htmlfile"); print HTML $template->output(). "\n"; close(HTML); } } sub readdatafile($) { my($rdata) = @_; my($line); my($from, $rank, $item, $itemurl, $maker, $makerurl, $value); if (-f $datafile) { open(IN, $datafile) || die("Panic! open error $datafile"); while(<IN>) { chop; $line = $_; # どうしても、SJISで保存した場合には、次のコメントを取ってください。 # $line = Jcode->new($line)->euc; ($from, $rank, $item, $itemurl, $maker, $makerurl, $value) = split(m/,/, $line); my(%d); $d{'from'} = $from; $d{'to'} = &add6day($from); $d{'rank'} = $rank; $d{'item'} = $item; $d{'itemurl'} = $itemurl; $d{'maker'} = $maker; $d{'makerurl'} = $makerurl; $d{'value'} = $value; push(@{$rdata}, \%d); } close(IN); } } sub updatedatafile($) { my($rdata) = @_; my($ymd, $i, @work, $line); $ymd = join('/', $in{'yy'}, $in{'mm'}, $in{'dd'}); for ($i = 0; $i <= scalar(@{$rdata}-1)-1; $i++) { if ($rdata[$i]->{'from'} ne $ymd) { push(@work, $rdata[$i]); } } for ($i = 0; $i < $max; $i++) { my(%d); $d{'from'} = $ymd; $d{'rank'} = $i+1; $d{'item'} = $in{"item$i"}; $d{'itemurl'} = $in{"itemurl$i"}; $d{'maker'} = $in{"maker$i"}; $d{'makerurl'} = $in{"makerurl$i"}; $d{'value'} = $in{"value$i"}; push(@work, \%d); } @work = sort sortsub @work; open(OUT, "> $datafile") || die("Panic! open error $datafile"); for ($i = 0; $i <= scalar(@work)-1; $i++) { $line = join(',', $work[$i]->{'from'} , $work[$i]->{'rank'} , $work[$i]->{'item'} , $work[$i]->{'itemurl'} , $work[$i]->{'maker'} , $work[$i]->{'makerurl'} , $work[$i]->{'value'}); # どうしても、SJISで保存した場合には、次のコメントを取ってください。 # $line = Jcode->new($line)->sjis; print OUT $line. "\n"; } close(OUT); } sub sortsub { $a->{'from'} cmp $b->{'from'} || $a->{'rank'} <=> $b->{'rank'}; } sub add6day($) { my($day) = @_; my($y, $m, $d); my(@max) = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); if (($y % 4) == 0) { $max[1] = 29; if (($y % 100) == 0) { $max[1] = 28; if (($y % 400) == 0) { $max[1] = 29; } } } ($y, $m, $d) = split(m|/|, $day); $d += 6; if ($max[$m-1] < $d) { $d -= $max[$m-1]; $m++; if ($m == 12) { $m = 0; $y++; } } $day = join('/', $y, $m, $d); ($day); } ----- $$$ entry.cgi $$$ ----- ----- ^^^ entry.thtml ^^^ ----- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> <meta name="keywords" content="<TMPL_VAR NAME="KEYWORDS">"> <meta name="description" content="<TMPL_VAR NAME="DESCRIPTION">"> <title><TMPL_VAR NAME="PAGENAME"></title> </head> <body> <div align="left"> <form action="entry.cgi" method="post"> <font color="#ff0000"> <TMPL_VAR NAME=ERROR> </font> <p align="left"> <input type="text" name="yy" size="4" value="<TMPL_VAR NAME=YY>">年 <input type="text" name="mm" size="2" value="<TMPL_VAR NAME=MM>">月 <input type="text" name="dd" size="2" value="<TMPL_VAR NAME=DD>">日 </p> <table border="1"> <tr> <th align="center">順位</th> <th align="center">商品名</th> <th align="center">商品URL</th> <th align="center">メーカー</th> <th align="center">メーカーURL</th> <th align="center">在庫数</th> </tr> <TMPL_LOOP NAME=ENTRY_LOOP> <tr> <td align="right"><TMPL_VAR NAME=RANK></td> <td align="left"><TMPL_VAR NAME=ITEM></td> <td align="left"><TMPL_VAR NAME=ITEMURL></td> <td align="left"><TMPL_VAR NAME=MAKER></td> <td align="left"><TMPL_VAR NAME=MAKERURL></td> <td align="left"><TMPL_VAR NAME=VALUE></td> </tr> </TMPL_LOOP> </table> <p align="center"> <input type="submit" value="読込" name="smode">  <input type="submit" value="登録" name="smode">  <input type="submit" value="生成" name="smode">  <input type="submit" value="リロード" name="smode"> </p> </div> </form> </body> </html> ----- $$$ entry.thtml $$$ ----- ----- ^^^ ranking.thtml ^^^ ----- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> <meta name="keywords" content="<TMPL_VAR NAME="KEYWORDS">"> <meta name="description" content="<TMPL_VAR NAME="DESCRIPTION">"> <title><TMPL_VAR NAME="PAGENAME"></title> </head> <body> <p align="center"> <TMPL_VAR NAME=FROMDAY>~<TMPL_VAR NAME=TODAY>のランキング </p> <div align="center"> <table border="1"> <tr> <th align="center">順位</th> <th align="center">商品名</th> <th align="center">メーカー</th> <th align="center">在庫数</th> </tr> <TMPL_LOOP NAME=ENTRY_LOOP> <tr> <td align="right"><TMPL_VAR NAME=RANK></td> <td align="left"><TMPL_VAR NAME=ITEM></td> <td align="left"><TMPL_VAR NAME=MAKER></td> <td align="right"><TMPL_VAR NAME=VALUE></td> </tr> </TMPL_LOOP> </table> </div> </body> </html> ----- $$$ ranking.thtml $$$ ----- 以上です。 不明点があれば、分かるまで突っ込んで質問してください。 レスポンスは落ちぎみですが(^_^;;)

ttoottoorroo
質問者

お礼

度々のお返事ありがとうございます。 ようやく時間を作る事ができ、修正版を使用させて頂きました。 メーカーへのリンクが、在庫数になってしまい、登録時の画面と作成されたhtmlが文字化けしてしまっています。 自分が、csvデータの文字化けを記載した事で、ソースに # どうしても、SJISで保存した場合には、次のコメントを取ってください。 とあるように、なんらかの処理をして頂いた結果、このようになったのだと思いますので、上に参考資料を色々と掲載して頂けていますので、元ファイルからの改造を行っていきたいと思います。 今まで、cgi関連の事で色々なサイトで質問してきましたが、このように一から作って頂いた事は本当に初めてです この度は本当にありがとうございました。 これ以上、お手を煩わすのも心許ないので、締め切らせて頂きます。 どうしても、分からない事がありましたら、また質問させて頂きます(^^;

  • Dpop
  • ベストアンサー率51% (279/544)
回答No.4

#1 です。 データファイルをCSVとしたい。と言う部分を失念していました。 ----- ^^^ entry.cgi ^^^ ----- #!/usr/local/bin/perl use HTML::Template; use Jcode; use CGI; use strict; my($max, $datafile); my($cgi, %in); my($i, @rdata, %conf); $max = 10; $datafile = 'ranking.csv'; $conf{'keywords'} = ''; $conf{'description'} = ''; $conf{'pagename'} = ''; $conf{'htmlfile'} = 'ranking%y%m%d.html'; $cgi = new CGI; $in{'smode'} = $cgi->param('smode'); $in{'yy'} = $cgi->param('yy'); $in{'mm'} = $cgi->param('mm'); $in{'dd'} = $cgi->param('dd'); for ($i = 0; $i < $max; $i++) { $in{"item$i"} = $cgi->param("item$i"); $in{"itemurl$i"} = $cgi->param("itemurl$i"); $in{"maker$i"} = $cgi->param("maker$i"); $in{"value$i"} = $cgi->param("value$i"); } &readdatafile(\@rdata); if ($in{'smode'} eq '読込') { &dispday(\@rdata); } elsif ($in{'smode'} eq '登録') { &updatedatafile(\@rdata); &disp(); } elsif ($in{'smode'} eq '生成') { &makehtml(\@rdata); &disp(); } else { &disp(); } exit(0); sub disp { my($i, @entry_loop, $template); my($yy, $mm, $dd, $week); my(@mmax) = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); $template = HTML::Template->new(filename => 'entry.thtml'); ($yy, $mm, $dd, $week) = (localtime(time))[5, 4, 3, 6]; $yy += 1900; $mm++; if ($week != 0) { if (($yy % 4) == 0) { $mmax[1] = 29; if (($yy % 100) == 0) { $mmax[1] = 28; if (($yy % 400) == 0) { $mmax[1] = 29; } } } $dd -= $week; if ($dd < 0) { $mm--; if ($mm == 0) { $yy--; $mm = 12; } $dd += $mmax[$mm-1]; } } $template->param(YY => $yy); $template->param(MM => $mm); $template->param(DD => $dd); for ($i = 0; $i < $max; $i++) { my(%row); $row{'RANK'} = $i+1; $row{'ITEM'} = qq|<input type="text" name="item$i" size="40">|; $row{'ITEMURL'} = qq|<input type="text" name="itemurl$i" size="80">|; $row{'MAKER'} = qq|<input type="text" name="maker$i" size="20">|; $row{'VALUE'} = qq|<input type="text" name="value$i" size="7">|; push(@entry_loop, \%row); } $template->param(ENTRY_LOOP => \@entry_loop); $template->param(KEYWORDS => $conf{'keywords'}); $template->param(DESCRIPTION => $conf{'description'}); $template->param(PAGENAME => $conf{'pagename'}); print "Content-Type: text/html\n\n"; print $template->output; } sub dispday { my($rdata) = @_; my($i, $ymd, @d, @entry_loop, $template); $template = HTML::Template->new(filename => 'entry.thtml'); if (($in{'yy'} eq '') || ($in{'mm'} eq '') || ($in{'dd'} eq '')) { $template->param(ERROR => '日付が入力されていません。'); } $ymd = join('/', $in{'yy'}, $in{'mm'}, $in{'dd'}); for ($i = 0; $i <= scalar(@{$rdata})-1; $i++) { if ($rdata[$i]->{'from'} eq $ymd) { $d[$rdata[$i]->{'rank'}-1] = $rdata[$i]; } } if (scalar(@d) == 0) { $template->param(ERROR => '指定された日付のデータはありません。'); } else { $template->param(YY => $in{'yy'}); $template->param(MM => $in{'mm'}); $template->param(DD => $in{'dd'}); for ($i = 0; $i < $max; $i++) { my(%row); $row{'RANK'} = $i+1; $row{'ITEM'} = qq|<input type="text" name="item$i" size="40" | . qq|value="|. $d[$i]->{'item'}. qq|">|; $row{'ITEMURL'} = qq|<input type="text" name="itemurl$i" size="80" | . qq|value="|. $d[$i]->{'itemurl'}. qq|">|; $row{'MAKER'} = qq|<input type="text" name="maker$i" size="20" | . qq|value="|. $d[$i]->{'maker'}. qq|">|; $row{'VALUE'} = qq|<input type="text" name="value$i" size="7" | . qq|value="|. $d[$i]->{'value'}. qq|">|; push(@entry_loop, \%row); } $template->param(ENTRY_LOOP => \@entry_loop); } $template->param(KEYWORDS => $conf{'keywords'}); $template->param(DESCRIPTION => $conf{'description'}); $template->param(PAGENAME => $conf{'pagename'}); print "Content-Type: text/html\n\n"; print $template->output; } sub makehtml($) { my($rdata) = @_; my($i, %d, $day); my($yy, $mm, $dd); my($template, $htmlfile, @fd, @td, @entry_loop); for ($i = 0; $i <= scalar(@{$rdata})-1; $i++) { $d{$rdata[$i]->{'from'}}[$rdata[$i]->{'rank'}-1] = $rdata[$i]; } foreach $day (sort keys %d) { (@fd) = split(m|/|, $d{$day}[0]->{'from'}); (@td) = split(m|/|, $d{$day}[0]->{'to'}); $htmlfile = $conf{'htmlfile'}; $yy = sprintf("%04d", $fd[0]); $mm = sprintf("%02d", $fd[1]); $dd = sprintf("%02d", $fd[2]); $htmlfile =~ s/%y/$yy/g; $htmlfile =~ s/%m/$mm/g; $htmlfile =~ s/%d/$dd/g; $template = HTML::Template->new(filename => 'ranking.thtml'); $template->param(FROMDAY => sprintf("%4d年%2d月%2d日", @fd)); $template->param(TODAY => sprintf("%4d年%2d月%2d日", @td)); @entry_loop = (); for ($i = 0; $i < $max; $i++) { my(%row); $row{'RANK'} = $i+1; $row{'ITEM'} = qq|<a target="_blank" | . qq|href="|. $d{$day}[$i]->{'itemurl'}. qq|"| . qq|title="|. $d{$day}[$i]->{'item'}. qq|">| . $d{$day}[$i]->{'item'} . qq|</a>|; $row{'MAKER'} = $d{$day}[$i]->{'maker'}; $row{'VALUE'} = $d{$day}[$i]->{'value'}; push(@entry_loop, \%row); } $template->param(ENTRY_LOOP => \@entry_loop); open(HTML, "> $htmlfile") || die("Panic! open error $htmlfile"); print HTML $template->output(). "\n"; close(HTML); } } sub readdatafile($) { my($rdata) = @_; my($from, $rank, $item, $itemurl, $maker, $value); if (-f $datafile) { open(IN, $datafile) || die("Panic! open error $datafile"); while(<IN>) { chop; ($from, $rank, $item, $itemurl, $maker, $value) = split(m/,/); my(%d); $d{'from'} = $from; $d{'to'} = &add7day($from); $d{'rank'} = $rank; $d{'item'} = $item; $d{'itemurl'} = $itemurl; $d{'maker'} = $maker; $d{'value'} = $value; push(@{$rdata}, \%d); } close(IN); } } sub updatedatafile($) { my($rdata) = @_; my($ymd, $i, @work, $line); $ymd = join('/', $in{'yy'}, $in{'mm'}, $in{'dd'}); for ($i = 0; $i <= scalar(@{$rdata}-1)-1; $i++) { if ($rdata[$i]->{'from'} ne $ymd) { push(@work, $rdata[$i]); } } for ($i = 0; $i < $max; $i++) { my(%d); $d{'from'} = $ymd; $d{'rank'} = $i+1; $d{'item'} = $in{"item$i"}; $d{'itemurl'} = $in{"itemurl$i"}; $d{'maker'} = $in{"maker$i"}; $d{'value'} = $in{"value$i"}; push(@work, \%d); } @work = sort sortsub @work; open(OUT, "> $datafile") || die("Panic! open error $datafile"); for ($i = 0; $i <= scalar(@work)-1; $i++) { $line = join(',', $work[$i]->{'from'} , $work[$i]->{'rank'} , $work[$i]->{'item'} , $work[$i]->{'itemurl'} , $work[$i]->{'maker'} , $work[$i]->{'value'}); print OUT $line. "\n"; } close(OUT); } sub sortsub { $a->{'from'} cmp $b->{'from'} || $a->{'rank'} <=> $b->{'rank'}; } sub add7day($) { my($day) = @_; my($y, $m, $d); my(@max) = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); if (($y % 4) == 0) { $max[1] = 29; if (($y % 100) == 0) { $max[1] = 28; if (($y % 400) == 0) { $max[1] = 29; } } } ($y, $m, $d) = split(m|/|, $day); $d += 7; if ($max[$m-1] < $d) { $d -= $max[$m-1]; $m++; if ($m == 12) { $m = 0; $y++; } } $day = join('/', $y, $m, $d); ($day); } ----- $$$ entry.cgi $$$ -----

ttoottoorroo
質問者

お礼

なんとか本日、HTML::Templateモジュールのインストールも無事完了し、再度接続を試みた所今度はJcode.pmがないというエラーに… こちらも、色々なサイトを参考にし無事にインストールが完了し、希望通りの動きを体感する事ができました!! ただ、商品名へのリンクはできたのですが、メーカーサイトへのリンクができていなかったので、これから少し手を入れていきたいと思うのですが少し不安です… 保存されたcsvを見てみたら、日本語が文字化けしてしまっています… メーカー名へのリンクと共に、文字化けの対策をこれから手をつけていきたいと思うのですが、今まで項目を減らしたり、デザインをいじった程度しかperlの知識がない為、不安です… この2点が解消されるまでこのスレを締め切りませんので、Dpop様以外でもアドバイス頂けたら幸いです それ以外は完璧です! 希望通りの機能が備わっています!! 本当にありがとうございました! 以下、忘れない為ともしも私と同じくJcode.pmやHTML::Templateモジュールのインストールに困った方の為にも覚え書きとして手順を書いておきます。 Jcode.pmインストール方法 http://openlab.ring.gr.jp/ Jcode-* の「*」は任意のバージョン番号 # gunzip Jcode-*.tar.gz | tar xf - # tar -xvf Jcode-*.tar # cd Jcode-* # perl Makefile.PL; make; make install HTML::Templateモジュールのインストール http://search.cpan.org/~samtregar/HTML-Template-2.7/ # gzip -dc HTML-Template-2.7.tar.gz | tar xof - # cd HTML-Template-2.7 # perl Makefile.PL # make # make test # make install

  • Dpop
  • ベストアンサー率51% (279/544)
回答No.2

やりたいことが見えて来ました。 確認を含めて、もう少し詳しく聞かせてください。 やりたいこと ・週単位の売り上げベスト10を表示したい。 ・CGIを利用して、データの入力と表示を行いたい。 ・データ項目は、商品名、価格、メーカー、在庫数、商品へのURL ・順位付けはプログラムで行うのではなく、データ入力画面から指定できれば良い。 ・入力されたデータは、CSVで保存され、表示時にそのCSVファイルを参照して表示する様にしたい。 なんて感じでしょうか?上記で良いと考えて。 ・入力画面は、CGIで簡単に作れます。 ・表示部分は、CGIで作成する方法と、固定HTMLを出力する方法(CMSの様な感覚。)があります。 ・前週との差については、商品をコード管理しないとスムーズにはできません。 ・過去週のランキング表示については、ランキング表示をCGIで行うのであれば、容易にできます。固定HTMLであれば、ファイル名規則やリンク機能を考える必要があるので、やや面倒です。 ・表示をCGIで行う場合、そのページ全体が1つのCGIとなります。他のHTMLに組み込んで表示する。と言う事はできません。 こんな条件が伴うと思います。 入力画面部分は直ぐにできますが、表示部分についてはご希望によって変わると思います。 ちなみに、データの持ち方は、 週の初めの日付,順位,商品名,商品へのURL,価格,メーカー,在庫数 などと持って挙げれば良いでしょうね。このCSVファイルを手作業で作成して、表示部分だけをCGIで行う。と言う手もありますが。(週の終わりは、単に+7して日付を正規化するだけで問題無いでしょう。) 本当は、メーカーや商品をコード化して、別データで持ち、URL情報などはCGI側でリンクした方が効率良いのですが、コード化する作業が大変かな。 とりあえず、入力部分のサンプルだけでも作成して公開しましょうか?

ttoottoorroo
質問者

補足

度々のお返事ありがとうございます。 表示に関して、cgiで読み込んで表示でもhtmlに書き出して表示という形のいずれでも、特にこだわっておりませんが、サーバーへの負荷を考えると、htmlへの出力がいいのだろうとは感じています。 ただ、サーバーへの負荷が気になる程アクセスもないのが実情ですので…(トップページへ500PV/日)

  • Dpop
  • ベストアンサー率51% (279/544)
回答No.1

Web屋です。 質問の意図が今ひとつ理解できませんでした。 ・どの様なデータが入力される事を想定しているのか。(リンク情報も含めて。) ・どの様に表示されるのか。(特に、ABCDの各項目の優先順位絡み。) を明確にして頂けないと、プログラムになりません。 入力データの持ち方と表示方法が分かれば作るのは簡単でしょう。 過去情報については、入力データに日付を持たせて、同じロジックで順位を計算されるだけで良いと思います。 (前回との対比をイメージされているのであれば、もう少し複雑なロジックが必要になるとは思いますが。)

ttoottoorroo
質問者

補足

お返事ありがとうございます。 補足させていただきます。 まず、この質問をさせていただいたのは、このランキングの使用目的として、当店の店頭で販売される商品のランキングをWeb上に公開したいのです。 今まで月間で公開していたのですが、週間に変更しようと思い、少しでも手間を省きたいと思い、Web上で作成管理したいと思っています。 何年何月何日~何年の何月何日 を入力し、1位の入力欄、2位の入力欄・・・ というように、各順位の入力欄があり、そこに商品名と、価格、メーカー、在庫数、販売開始日等の項目を入力したいのです。 2項目だけリンクしたいのが、商品名とメーカーです。 メーカーサイトと、商品詳細ページ(これは別で作成済みのぺーじです)です。 必要最低限なのが、商品名、価格、メーカー、在庫数 の4項目です。 前回とのランク上下に関しても、数値による計算は特に必要ありません。 前回とのランク上下の表示も、「できれば」欲しい機能ではありますが、必要というわけではありません。 これに関しても、手動のプルダウンメニューで「上」「下」「継続」「新規」という項目を選択し、そのまま表示されてもいいのですが、あらかじめセットしていた画像で表示されればベストです。 データの保存はcsvがベストです

関連するQ&A

  • ファイル処理について

    宜しくお願いします。 ファイル「ppp.txt」の中の文字列を逆にする コードを組みたいのですが、どの本を読んでも ロジックが見当たりません。 ファイルppp.txtの中は以下です。 AAA BBB CCC DDD EEE -> EEE DDD CCC BBB AAA としたいのです。 じっくり探せばあると思うのですが、 急ぎなので投稿しました。 これを実現するPerlスクリプトコードを 教えて頂けないでしょうか。 宜しくお願いいたします。

    • ベストアンサー
    • Perl
  • 文字変換で,を改行されないようにしたい

    下記のスクリプトでファイルから読み込んだ行毎の文字列<>を'=>'に変換後、行の先頭に'を付け足し行の最後に',を付け加えた場合、変な風に改行されてしまいます。 $ cat list1.txt 01<>ああああ 01_01<>あAAA 01_02<>あBBB 01_03<>あCCC 01_04<>あDDD 02<>いいいい 02_01<>いAAA 02_02<>いBBB 02_03<>いCCC 02_04<>いDDD open(IN, "<list1.txt"); @datas = <IN>; close(IN); open(OUT, ">date.txt"); foreach (@datas) { ($a, $b) = split(/<>/, $_); print OUT "'$a'=>'$b',"; } close(OUT); 実行結果 $ cat date.txt '01'=>'ああああ ','01_01'=>'あAAA ','01_02'=>'あBBB ','01_03'=>'あCCC ','01_04'=>'あDDD ','02'=>'いいいい ','02_01'=>'いAAA ','02_02'=>'いBBB ','02_03'=>'いCCC ','02_04'=>'いDDD ', これを下記のように整形するにはスクリプトのどこを直せばよいのでしょうか。 '01'=>'ああああ', '01_01'=>'あAAA', '01_02'=>'あBBB', '01_03'=>'あCCC', '01_04'=>'あDDD', '02'=>'いいいい', '02_01'=>'いAAA', '02_02'=>'いBBB', '02_03'=>'いCCC', '02_04'=>'いDDD', どなたかご教授お願い致します。(上記のスクリプト以外の方法で スマートなやり方などありましたらあわせてご教授頂けますと助かります。)

    • ベストアンサー
    • Perl
  • テキスト処理のシェルプログラム

    UNIXシェルもしくはPerlでテキスト処理のシェルスクリプト を作成したいのですがご教授お願いします 1000行あるテキストファイルを 2行単位で区切り2行単位で横一列へ置換しテキストへ出力したいのですが 例 処理前 aaa bbb ccc ddd eee fff 処理後 aaa,ccc,eee bbb,ddd,fff ご教授よろしくお願いします

  • EXCELで行の先頭データが同じ行の削除方法について

    EXCELで次のようなことをしたいのですがどうしたら簡単にできるでしょうか?  AAA   AAA  AAA  AAA  AAA  BBB  BBB  BBB  CCC  DDD  DDD  DDD  DDD 上ようのなデータで重複している部分を削除し、  AAA  BBB  CCC  DDD としたいのですが。 今は一行々々で確認しながら削除してます。3000行程あり困ってます。 どうしたら簡単にできるでしょうか?  

  • ハッシュにおける値の取り出し

    初めて質問します。 Perl初心者なので、初歩的な質問かもしれませんが、 どなたかご教授お願いします。 下記のようなデータをDBから読み込み、ハッシュに 格納しました。しかし、個々の値にアクセスできず、 困っています。 例えば、NO01の項目1にアクセスしたい場合は、どうしたらよいのでしょうか。 %DATA NO  KOUMOKU1 KOUMOKU2 01 aaa AAA 02 bbb BBB 03 ccc CCC 04 ddd DDD 05 eee EEE よろしくお願いします。

    • ベストアンサー
    • Perl
  • ファイルの結合

    UNIX上で下記のようなfileA、fileBから fileA aaa,aaa,222 aaa,bbb,111 aaa,ccc,333 fileB aaa,aaa,111 aaa,bbb,222 aaa,ccc,333 aaa,ddd,999 下記のようなfileCを作ろうとしています。 fileC aaa,aaa,222 aaa,bbb,111 aaa,ccc,333 aaa,ddd,999 そこで、以下のように一列目と2列目をキーにして、sortすることにしました。 cat fileA fileB | sort -u -k1,2 -t, > fileC すると、fileCは下記のようになりました。(一行目の3列目が222ではなく、111になってしまいました) fileC aaa,aaa,111 aaa,bbb,222 aaa,ccc,333 aaa,ddd,999 キー項目以外はfileAを優先させたいのですが、なにか良い方法はないでしょうか?

  • awkやsed等で特定の文字間を抜き出す

    cat text aaaa bbbb <AAA> ccc ddd <BBB> eee とあるときに <AAA> ccc ddd <BBB> だけ抜き出したいです。 どのようにすればよいでしょうか?

  • アドレスの表示

    すみません。教えてください。 http://www/aaa.bbb.cccのサイトに繋いで、そこからジャンプすると、本来はその後に、ジャンプした詳細アドレスを、表示したいのですが、ツールの中にもそのような設定がないみたいなのですが・・・ http://www/aaa.bbb.cccから http://www/aaa.bbb.ccc.ddd.eee.htmlなどの表示をアドレスバー内に表示したいのですが。 わかりにくい質問ですが、よろしくお願いいたします。

  • シェルスクリプトについて

    シェルスクリプトについて Linuxで先頭にスペースが入っている行をひとつ上の行につなげたいと考えています。 その場合、シェルスクリプトはどのように書けばよいかご教示願います。 【ファイル内容】 aaa △bbb ccc ddd (b行の先頭のみスペース(△)が入っています。) 【変換後のファイル】 aaa bbb ccc ddd

  • フリー配布CGIのファイル名変更

    お世話になります。 メールで受信するフォームでを作っていますが、CGIを自分で組めないため配布CGIを利用させていただいてます。フリー配布CGIなのでカスタマイズ可能なのですが、ファイル名を変更しても機能するのか教えてください。 例えば <AAA>フォルダ  │--bbb.cgi  │--fff.pl  │--ccc.html があります。ccc.htmlを動かすためのbbb.cgiです。 もうひとつCGIを入れたいフォームeee.htmlが有る場合、上記のフォルダとファイルをコピーしてファイル名を変更して利用することはできますか? │ │--<AAA>フォルダ │   │--bbb.cgi │   │--fff.pl │   │--ccc.html | │--<DDD>フォルダ     │--bbb2.cgi     │--fff2.pl     │--eee.html ccc.htmlとeee.htmlのフォームの内容は異なるのですが、ファイル名を気軽に変更したcgiファイルでも大丈夫でしょうか? または、<AAA>にeee.htmlを入れてbbb.cgiを共有させることはできるのでしょうか?(<DDD>フォルダ以下はなしで) プログラムファイルを壊してしまうのが怖くてなかなか実行できないでいるのです。 抽象的な質問ですみませんが、よろしくお願いします。

    • ベストアンサー
    • CGI

専門家に質問してみよう