• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ランキング作成)

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

Dpopの回答

  • 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関連の事で色々なサイトで質問してきましたが、このように一から作って頂いた事は本当に初めてです この度は本当にありがとうございました。 これ以上、お手を煩わすのも心許ないので、締め切らせて頂きます。 どうしても、分からない事がありましたら、また質問させて頂きます(^^;

関連する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