• ベストアンサー

変動する

はじめまして CGIを学んで1ヶ月の者です。 実は、仕事で少し面倒な依頼を受けて困っております。 内容はCSV形式のデータをPerlで読み取ってそれを HTMLのテーブルに流し込むスクリプトなのですが、 慣れていないので思考停止をして進みません。 具体的なCSVデータの例ですが、 10,果物,りんご,ringo.html,ぶどう,budou.html,ばなな,banana.html,10,野菜,かぼちゃ,kabotya.html,なす,nasu.html,きゅうり,kyuri.html,魚,まぐろ,maguro.html,さけ,sake.html,10,肉,牛,usi.html,麺,ラーメン,ra-men.html,そば,soba.html,うどん,udon.html まず、先頭に10があり、これは分類の区切りを示すヘッダーです。 次に果物でこれは、分類名です。 次にりんご、これは分類詳細名です。 つぎにringo.htmlでこれは分類詳細名のリンク先アドレスです。 このようなデータの並びですが、各分類と詳細項目は変動しますので このテーブルのあるWEBページを毎回読み直す必要があります。 どうのようにしたらよいのでしょうか。 お助けください。

  • hooma
  • お礼率32% (51/157)
  • Perl
  • 回答数13
  • ありがとう数11

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

  • ベストアンサー
  • callhiro
  • ベストアンサー率35% (54/152)
回答No.13

たびたび登場です。 前回紹介したのは基本的な間違いがいっぱいありました。 あと「全角スペース」がよけいにあってはいけないこともわかりました。 この掲示板では、全角スペースを入れないと左詰になってしまい、 みにくなりますが、 コピーした後半角スペースかタブで調節して見やすくしてください。 この前の失敗 1. 「$i」とすべきところを「i」としている箇所が多い 2. 「$title_color」を突然書いていた→「bgcolor=$title_color」 3. よけいな全角スペースがあった→すべての全角スペースを無くしました 以上をふまえて、hoomaさんのスクリプトを集成し、 実際に試してみてちゃんと実行できました。 どうぞお試しあれ。 htmlの表示部分から修正スクリプトを載せておきます。 ------------------------------------------ print "Content-type:text/html\n\n"; print "<html>\n"; print "<body>"; $title_color = "#6699cc"; print "<table>\n"; foreach $output (@lines){ @table= split(',',$output); for($i=0;$i+1<$#table;$i=$i+2){ if($table[$i] == 10){ print"<tr><td bgcolor=$title_color>$table[$i+1]</td></tr>\n"; next; } if($table[$i] == 20 && $table[$i+2] == 30){ print"<tr><td><a href=$table[$i+3]>$table[$i+1]</a></td></tr>\n"; $i = $i+2; next; } if($table[$i] == 20 && $table[$i+2] != 30){ print"<tr><td>$table[$i+1]</td></tr>\n"; next; } } } print"</table>"; print "</body>\n"; print "</html>\n"; ------------------------------------------

hooma
質問者

お礼

ありがとうございました。 お礼がしたいのでメールアドレスを教えてください。

その他の回答 (12)

  • callhiro
  • ベストアンサー率35% (54/152)
回答No.12

こんにちは。 #リストの細分化 foreach $output (0..$#lines){  @table= split(',',$lines[0]); } これですと、 せっかくforeach文を使って、 データの数だけ繰り返し処理しているのに、 その中では、全く同じ事しかしていませんので、 一行のデータの処理しかできません。 foreach $output (@lines){  @table= split(',',$output); } とすると、@linesの数だけforeach文で処理が繰り返され、 一行ごとのデータが$outputに入り、 その$outputのデータを毎回切り分けていますので、 @tableには新しい情報が入っていきます。 でも(多分)どんどん上書きされてしまうので、 このループの中で表示もしてしまった方が良いです。 (まあ別の変数にデータを入れてもいいんですが) とりあえず全てのデータを改行させながら表示させるのでしたら foreach $output (@lines){  @table= split(',',$output);  for($i=0;$i<$#table;$i++){   print "$table[i]<BR>\n";  } } とすると、もともとのデータが細切れになり改行されて全て表示されるでしょう。 まだ規則的でないデータが@tableにストリームとして入っているだけですので、 テーブルを作成する段階ではないので、もう少し処理が必要です。 10,分類,20,詳細名,30,リンク先,20,詳細,20,詳細名,30,リンク先,名,30,リンク先 10,分類,20,詳細名,30,リンク先 10,分類,20,詳細名,30,リンク先,20,詳細,20,詳細名,30,リンク先,名,30,リンク先 このデータで僕が表を作るとすると、 -------------------------------------------- $title_color = blue; print "<table>\n"; foreach $output (@lines){  @table= split(',',$output);  for($i=0;$i+1<$#table;$i+2){   if($table[i] == 10){    print"<tr><td $title_color>$table[i+1]</td></tr>\n";    next;   }   if($table[i] == 20 && $table[i+2] == 30){    print"<tr><td><a href=$table[i+3]>$table[i+1]</a></td></tr>\n";    i = i+2;    next;   }   if($table[i] == 20 && $table[i+2] != 30){    print"<tr><td>$table[i+1]</td></tr>\n";    next;   }  } } print"</table>"; -------------------------------------------- といった感じになります(ただし動作未確認)。

hooma
質問者

補足

こんばんは いただいたソースを元に付け合せてPCのアパッチで試しても、うまくでないので ACTIVE perlで -CWをつけてチェックしたところ下記の警告がでました。 Unrecognized character \201 at test1.pl line 21. これってなんですか、 それと何か記述がおかしいでしょうか。 --------------------試したソース---------------- #!C:\perl\bin\perl #ファイルの読み込み $file = "sample2.csv"; open(DB,"$file"); @lines = <DB>; close(DB); #改行データ除去 chomp($lines); print "Content-type:text/html\n\n"; print "<html>\n"; $title_color = "#6699cc"; print "<table>\n"; foreach $output (@lines){  @table= split(',',$output);  for($i=0;$i+1<$#table;$i+2){   if($table[i] == 10){    print"<tr><td $title_color>$table[i+1]</td></tr>\n";    next;   }   if($table[i] == 20 && $table[i+2] == 30){    print"<tr><td><a href=$table[i+3]>$table[i+1]</a></td></tr>\n";    i = i+2;    next;   }   if($table[i] == 20 && $table[i+2] != 30){    print"<tr><td>$table[i+1]</td></tr>\n";    next;   }  } } print"</table>"; print "</body>\n"; print "</html>\n";

  • dany
  • ベストアンサー率35% (27/77)
回答No.11

>foreach $output (0..$#lines){ >@table= split(',',$lines[0]); >} >上記のリスト細分化の部分は今のところ1行しか処理できないようになっていますが、 そりゃ行番号をしちゃってますから。 リファレンス本で foreach の構文を調べてください。 ところでこれだと @table が毎回上書きされちゃって、 後半のforeachでは最後の @tableしか出力してないのでは?

  • dany
  • ベストアンサー率35% (27/77)
回答No.10

>データの中に識別子を付けた場合、後で、取り除くための記述はどうしたらいいでしょうか。 $hoe ~= s/^10_//; です。

  • dany
  • ベストアンサー率35% (27/77)
回答No.9

>10,分類,20,詳細名,30,リンク先,20,詳細20,詳細名,30,リンク先,名,30,リンク先 それだったら 10_A,20_B,30_C,20_B,30_C~ って感じに「データの中に判別子を埋める」ほうがいいです。 「今“10”だったから次のデータは“分類”だ」よりも 「頭が“10”だからこのデータは“分類”だ」のほうがソースが 見やすくなります。頭の「10_」とかは後で消せばいいわけです。 しかし本当は「位置でデータ種別を判別させる」ほうが簡潔だし 処理も早くなります。なぜに下記のような表計算リスト的なデータ にしないのでしょうか? A,B,C,D A,B,C,D A,B,C,D ,,C,D ↑でもいいですから、とにかく「項目の位置は固定」させたほうが いいです。実際にくんでみればわかります。

hooma
質問者

補足

ありがとうございます。 danyさんのおっしゃるとおり、データの中に識別子を付けた場合、後で、取り除くための記述はどうしたらいいでしょうか。

  • dany
  • ベストアンサー率35% (27/77)
回答No.8

No.4の返答への返答です。 この返答で私が書いた「HEAD TYPE NAME ADDR」というのは 10,果物,りんご,ringo.html,ぶどう,budou.html,ばなな,banana.html,10,野菜,かぼちゃ,kabotya.html,なす,nasu.html,きゅうり,kyuri.html,魚,まぐろ,maguro.html,さけ,sake.html,10,肉,牛,usi.html,麺,ラーメン,ra-men.html,そば,soba.html,うどん,udon.html というデータよりも 10,果物,りんご,ringo.html 10,果物,ぶどう,budou.html ~略~ 10,麺,そば,soba.html 10,麺,うどん,udon.html 「1データ1行で、1行は同じ項目数」という感じに元データを作り直して もらったほうがいいということです。 で、今気付いたんですが、 A,B,C,D,A,B,C,D,A,B,C,D, って感じに項目数は同じなのかと思いました。 A,B,C,D,C,D,C,D, なんですね。これだとNo2、No.3のサンプルはまったくのゴミです。^^; 提示された形式だと、「中に入っているデータがどんな形式なのか」を 調べないといけないし、もしデータに規則性がないなら判断のしようも ありません。それとも「10」という数字がデリミタ(分割指定子)ですか? いずれにせよ、もし私がこの仕事をやるハメになったとしたら 「こんなデータではやってられません。元データを作り直してください」 ってとこからスタートします。^^;

hooma
質問者

補足

たびたびありがとうございます。 やはりデータを見直したほうがいいですね。 それで、データの種別をはっきりわかるようにするために 10,分類,20,詳細名,30,リンク先,20,詳細20,詳細名,30,リンク先,名,30,リンク先 10,分類,20,詳細名,30,リンク先 10,分類,20,詳細名,30,リンク先,20,詳細20,詳細名,30,リンク先,名,30,リンク先 のようにしたほうが作りやすいのかなと思いこういう形式で現在考えてます。 これでしたら、楽になりますでしょうか。

  • callhiro
  • ベストアンサー率35% (54/152)
回答No.7

多次元配列って使ったことないんですが、 @datasに各行のデータが入っているとして、 print "<table>\n"; foreach $data (@datas){  $dataを細切れにする  細切れデータから表を作る } print "</table>\n"; のような感じではできないでしょうか?

hooma
質問者

補足

現在、わたくしが出来ているところまで掲載いたします。 #!C:\perl\bin\perl #ファイルの読み込み $file = "sample.csv"; open(DB,"$file"); @lines = <DB>; close(DB); #改行データ除去 chomp($lines); #リストの細分化 foreach $output (0..$#lines){ @table= split(',',$lines[0]); } foreach $i(0..$#table){ print $table[$i],"\n"; $i+=1; } それで、問題なのですが、上記のリスト細分化の部分は今のところ1行しか処理できないようになっていますが、これを全行処理させたいのです。 それとも、この部分をサブルーチンにして、 FOR文で繰り返して、行を変えながらサブルーチンに飛ばしたほうがよいのでしょうか。 その場合、最終行を見分ける方法がわかりません。 どうしたらよいでしょうか。

  • callhiro
  • ベストアンサー率35% (54/152)
回答No.6

どうもこんばんは。 再び登場です。 >ある分類がポッカリなくなったり、ある分類内の詳細名が増減することを想定しないといけないもので、やっかいに感じてます。 hoomaさんは変動するデータや、項目の変動が激しいことを気にしていらっしゃるようですが、 自作のCGIをいくつか遊びで作ってきた経験から言わせてもらいますと、 そういう変動するデータのためにこそCGIが有効ではないかと思います。 htmlでは固定的な表現しかできませんが、プログラムを使うことの利点は アクセスする度に変動的な表現ができることではないでしょうか? 項目が変動した場合にもばりばり動かすCGIを作ろうと思っているなんて 個人的には楽しそうでうらやましいです(笑) 僕も仕事でそういうの任されてみたいです(^^) どのように変動データに対応するかは CGIプログラムの問題ではなくて アルゴリズムの問題だと思います。 まあPerlのプログラミングとして、 どのようにデータを加工するのがやりやすいか などを気にする必要もあるので、 アルゴリズムとプログラムは同時に考えた方がいいですけどね。 ある程度経験のある人なら、 元データがこういう形の方が扱いやすいと言うこともわかると思います。 お礼を見ていると、「これ以上答えてもらうのは悪い」という感じが伝わってきましたが、 そんなことありませんので、もっと具体的な困っている箇所をあげてくだされば、 一つずつ進んでいけるのではと思いますよ。 あと、特にUNIXの知識なんて必要ないような気がしますが。

hooma
質問者

お礼

お礼ではのですが、補足をしたくても 入れる場所がないのでこちらで失礼します。 いろいろ試して、ようやく読み込んだCSVデータを配列に入れてsplitをかけて、細切れにすることはできました。(ただし、1行だけ) そこで、教えていただきたいのですが、全行を多次元配列などにしてsplitをかけるにはどうしたらいいでしょうか。 foreachなどで試しましたが、うまくいきません。

hooma
質問者

補足

あたたかいお言葉ありがとうございます。 他の補足でも説明しましたが、 http://www.niigata-megumi.co.jp/rdn/ 「取扱品目」のページのようなレイアウトで 表はCSVで流し込みをするということです。 とあるシステム系の会社のサイト構築を頼まれて、デザインを主にやってます。 そのなかで、CGIがたくさん絡んできており、ほとんどが外注に出して出来上がってますが、クライアントは一方ついてから、今回のようなスクリプトを用意してくれと言ってきたのでGW前に納品しないといけないので切羽詰っています。 今、私が自分で確認してできているスクリプトは 表(中身は空)をHTMLに書き出すCGIだけです。 CSVを読み込んで、配列にいれて細切れにして、データの種別」を判断し、テーブルに書きだすというものが 使い慣れていないのでアドバイスをいただいても「あーそうか!」と言って実行に移せないのです。 こわがっているのかもしれません。 でも、明日は1日perlと闘えそうなので、じっくり取り組んでみます。

  • dany
  • ベストアンサー率35% (27/77)
回答No.5

一行にすると &conv2 のような余計な行程が必要になってくるから やめたほうがいいです。ExcelやAccessの画面をイメージしていただけると わかると思いますが、 HEAD TYPE NAME ADDR HEAD TYPE NAME ADDR HEAD TYPE NAME ADDR という感じに並ぶのが一番効率がいいです。 TYPEが存在しない場合は空欄に、ひとつの項目に複数存在する 場合は「/」とか、“絶対使われない文字”で区切るのがいいです。 head(TAB)type(TAB)name,name2(TAB)addr みたいな感じにTABで区切り、項目内をさらに分割するときは 「,」みたいな。 # 現実逃避終了したので以降の回答がニブくなると思われます(笑)

hooma
質問者

補足

すみません教えていただきたいのですが、 @TYPE = qw( HEAD TYPE NAME ADDR ); という記述がありますが、例えばデータが 10,果物,りんご,ringo.htmlとなっていた場合に、 HEAD TYPE NAME ADDRにはどう記述すればよいのでしょうか。HEADは10 のような気がしますが、他の場合変わってしまうのでどうしたらいいのかわかりません。

  • dany
  • ベストアンサー率35% (27/77)
回答No.4

質問にあったのが「決まった順番が横並びに連続する。しかも数は変動」 という前提で作ってみたものです。「&conv1」→「&conv2」にする 以外は同様。 あとTABLEにするのなら「<tr></tr>」が必要というのを忘れてたので それも追加しました。 # 変換タイプ2 # ==================== sub conv2{  my $line = shift;          # 渡された行の内容  @lines = split( ',',$line );    # 「,」で分割して配列へ  foreach $i ( 0 .. $#lines ){    # 0番目から配列の最後まで繰り返す   $x = (($i+1) % ($#TYPE +1)) - 1;   if( $TYPE[$x] eq 'HEAD' ){    # 以降、番号に対応した項目で変換処理    ~HEAD項目に対する変換処理~    }elsif( $TYPE[$x] eq 'TYPE' ){    ~TYPE項目に対する変換処理~   }elsif( $TYPE[$x] eq 'NAME' ){    ~NAME項目に対する変換処理~   }elsif( $TYPE[$x] eq 'ADDR' ){    ~ADDR項目に対する変換処理~   }   $output .= '<tr>' if $x == 0;   # 最初のやつなら<tr>追加   $output .= $lines[$i];       # 出力用変数に追加書き   $output .= '</tr>' if $x == -1;  # 最後なら</tr>追加  } } # ==================== >$x = (($i+1) % ($#TYPE +1)) - 1; ↑ちょっとわかりにくいかもですね。^^; 何番目の項目かというのを判別するには、項目数で割った余り(%)を 求めればいいのですが、番号が「0」から始まるので「+1」してます。 「$#TYPE」は「@TYPE」の最後の添え字、この場合「3」が入ってます。 項目数は「4」ですがやはり「0」から始まるので「+1」してます。 1番目 … ((0+1)%(3+1))-1 = 0 2番目 … ((1+1)%(3+1))-1 = 1 3番目 … ((2+1)%(3+1))-1 = 2 4番目 … ((3+1)%(3+1))-1 = -1 5番目 … ((4+1)%(3+1))-1 = 0 6番目 … ((5+1)%(3+1))-1 = 1 7番目 … ((6+1)%(3+1))-1 = 2 8番目 … ((7+1)%(3+1))-1 = -1 9番目 … ((8+1)%(3+1))-1 = 0 4番目は「3」を出したいところですが、Perlは配列の何番目かを 指定するとき「-1」すると、後ろから、つまり最後のものを取得 してくれるのでこのままにしてます。他の言語ではダメかも。^^; ~変換処理~のところは $line[$i] =~ s/^(.+)$/<td>$1<\/td>/; もしくは↓のほうがスッキリ $line[$i] =~ s|^(.+)$|<td>$1</td>|; ぬ、とてもPerl歴一ヶ月の人に教えるようなものではないですね…。^^; まぁこういう方法もあるよ程度に留めておくといいかも。

hooma
質問者

お礼

ありがとうございました。 後は、なんとか自力で考えていきます。 perlはUNIXの知識も必要になるので、 習得しずらいのかな感じてます。

hooma
質問者

補足

本当にお世話になっております。 最終的には下記のレイアウトで表示させたいのですが、 http://www.niigata-megumi.co.jp/rdn/ トップページから「取扱品目」のリンクをクリックしてください。 そうすると表が出てくると思います。 そのようなレイアウトの表にCSVデータを流し込んで、 リンクさせていきたいと考えております。 この表内に流すCSVデータですが、 ある分類がポッカリなくなったり、ある分類内の詳細名が増減することを想定しないといけないもので、やっかいに感じてます。 CSVのレコードフォーマットはやりやすいように考えてもいいとクライアントから言われています。

  • dany
  • ベストアンサー率35% (27/77)
回答No.3

解説するより実際の処理を見てもらったほうが早いかなと 思ってつらつらと書いてみました。 >このようなデータの並びですが、各分類と詳細項目は変動しますので ↑を「項目の並び順が変動」と勘違いして書いたので項目順序が変わっても @TYPEを書き換えればいいようにしてみました。 $FILE = './hoehoe.csv'; $HTML = './hoehoe.htm'; @TYPE = qw( HEAD TYPE NAME ADDR );  # 項目のタイプを指定 open( IN,$FILE )||&error; while( $line = <IN> ){        # 一行ずつ読み込む  chomp( $line );           # 改行コードを削除  &conv1( $line );          # 変換処理 } close( IN ); open( OUT, '>'.$HTML );        # 出力ファイルを開く  print OUT $output;         # 書き出す close( OUT ); exit;                 # 終了 # 変換タイプ1 # ==================== sub conv1{  my $line = shift;          # 渡された行の内容  @lines = split( ',',$line );    # 「,」で分割して配列へ  foreach $i ( 0 .. $#lines ){    # 0番目から配列の最後まで繰り返す   if( $TYPE[$i] eq 'HEAD' ){    # 以降、番号に対応した項目で変換処理   ~HEAD項目に対する変換処理~   }elsif( $TYPE[$i] eq 'TYPE' ){   ~TYPE項目に対する変換処理~   }elsif( $TYPE[$i] eq 'NAME' ){   ~NAME項目に対する変換処理~   }elsif( $TYPE[$i] eq 'ADDR' ){   ~ADDR項目に対する変換処理~   }   $outpt .= $lines[$i];       # 出力用変数に追加書き  } } ところで 10,果物,りんご,ringo.html,ぶどう,budou.html,ばなな,banana.html,10,野菜,かぼちゃ,kabotya.html,なす,nasu.html,きゅうり,kyuri.html,魚,まぐろ,maguro.html,さけ,sake.html,10,肉,牛,usi.html,麺,ラーメン,ra-men.html,そば,soba.html,うどん,udon.html ってひょっとして一行になってるんですか?

hooma
質問者

補足

いろいろありがとうございます。 今のところ、CSVデータは1行になっているものとして考えています。 それは、今後このCSVデータをデータベースで書き出してそれをperlで読み取って変動するWEBページを目指しているからです。 リンクするページが激しく変動するので手作業で直すことは避けたいための考えですが、 もし、1行じゃないほうがいいのでしたら、各分類ごとに改行して複数行にしても構わないと思います。

関連するQ&A

  • 変動するリンクデータを読み取って、毎回変わるHTMLテーブルに流し込む方法

    はじめまして CGIを学んで1ヶ月の者です。 実は、仕事で少し面倒な依頼を受けて困っております。 内容はCSV形式のデータをPerlで読み取ってそれを HTMLのテーブルに流し込むスクリプトなのですが、 慣れていないので思考停止をして進みません。 具体的なCSVデータの例ですが、 10,果物,りんご,ringo.html,ぶどう,budou.html,ばなな,banana.html,10,野菜,かぼちゃ,kabotya.html,なす,nasu.html,きゅうり,kyuri.html,魚,まぐろ,maguro.html,さけ,sake.html,10,肉,牛,usi.html,麺,ラーメン,ra-men.html,そば,soba.html,うどん,udon.html まず、先頭に10があり、これは分類の区切りを示すヘッダーです。 次に果物でこれは、分類名です。 次にりんご、これは分類詳細名です。 つぎにringo.htmlでこれは分類詳細名のリンク先アドレスです。 このようなデータの並びですが、各分類と詳細項目は変動しますので このテーブルのあるWEBページを毎回読み直す必要があります。 どうのようにしたらよいのでしょうか。 お助けください。

    • ベストアンサー
    • Perl
  • .htaccessでのカノニカル指定

    大量のPDFファイルを所持するサイトを運営しています。 ディレクトリ構成は、 ■ルート(http://hogehoge.com/) index.html hoge1.html hoge2.html │ └■食べ物フォルダ   ├index.html   │   ├■果物ごフォルダ   │ ├index.html   │ │   │ ├■りんごフォルダ   │ │ ├index.html   │ │ ├ringo1.pdf   │ │ ├ringo2.pdf   │ │ ├ringo3.pdf   │ │   │ ├■みかんフォルダ   │ │ ├index.html   │ │ ├mikan1.pdf   │ │ ├mikan2.pdf   │ │ ├mikan3.pdf   │ │   │ ├■ぶどうフォルダ   │   ├index.html   │   ├budou1.pdf   │   ├budou2.pdf   │   ├budou3.pdf   │   ├■野菜フォルダ   ・   ・   ・ ルート→「食べ物」→「果物 / 野菜」→「りんご・みかん・ぶどう / キャベツ・大根・人参」 という具合で、すべてのフォルダ内にはindex.htmlと関連する 複数のpdfファイルを格納している状態です。 それぞれのpdfファイルは内容がほぼ一緒なので link rel="canonical" を設定したいんです。 ringo1.pdf + ringo2.pdf + ringo3.pdf → りんごフォルダの index.html にカノニカル指定 という具合に全てのフォルダで行いたいのですが自分なりに調べた結果、 <FilesMatch "\.pdf$"> Header set Link "<http://hogehoge.com/食べ物/果物/(りんごorみかんorぶどう)/index.html>; rel=\"canonical\"" </FilesMatch> と記入した.htaccessファイルを各フォルダに1個1個設置すれば実現できると思うのですが、 数が膨大になってしまうので、もっとスマートな方法があれば・・ と思い質問させて頂きました。 詳しい方、どうか知恵をお貸し下さい。

    • ベストアンサー
    • PHP
  • リストボックスについて

    PHPをはじめて間もないのですが、質問します DB(MySql)のテーブルを使用してリストボックスの 選択肢をさせるようにしたいのですが、 同じ1つのリストボックスで選択するようにします テーブル CodeNo 商品名   分類 0001  バナナ   果物 0002  みかん   果物 0003  ピーマン  野菜 0004  トマト   果物 0005  もも    果物 0006  にんじん  野菜 のようなデータがあるとします (1)選択肢は分類のデータを表示します    果物    野菜 (2)(1)で選択された分類の商品名を選択肢にします    果物選択したとする    バナナ    みかん    トマト    もも (3) (2)で選択されたCodeNo,商品名を表示する    トマトを選択したとする 0004  トマト がテキストボックスに表示されるようにします。 以上のようなことをPHPですべてするにはどのようにすれば よいのか、ご教授いただけませんでしょうか? よろしくお願いいたします。    

    • 締切済み
    • PHP
  • 別シートのフィールドから同一値検索、隣フィールド値取得の関数を教えてください。

    ■シート1 ---------------- □分類□名 称□ ---------------- |果物|りんご| ---------------- |果物|バナナ| ---------------- |果物|みかん| ---------------- |野菜|トマト| ---------------- |野菜|セロリ| ---------------- |野菜|レタス| ---------------- ■シート2 ---------------- □名 称□分類□ ---------------- |りんご|  | ---------------- |トマト|  | ---------------- |バナナ|  | ---------------- |セロリ|  | ---------------- |みかん|  | ---------------- |レタス|  | ---------------- シート2の名称にてシート1の名称を検索して、シート2に分類を取得することは可能でしょうか。 よろしくお願いします。

  • PHP CSVから条件にあう行を3行取りだしたい

    以下のようなCSVがあったとします。(data.csv)価格で降順にソートしてあります。 line0,line1,line2 1,ぶどう,200(円) 2,なし,150(円) 3,りんご,100(円) 4,バナナ,80(円) 5,みかん,50(円) ある果物を紹介するページがあったとして、 そのページには、他のオススメの果物として、csvからデータを読み込み、 その果物よりも安いもの3件を表示するという仕組みを作ろうと思っています。 ただ、安いものが3件無かった場合に、それよりも高いが、それに近い価格の果物を あわせて3件まで紹介したいと思っています。 今作っているPHPは以下の通りです。 ページに紹介されている果物=($fruits),価格=($price) です。 <?php $Data=file('/data.csv'); $j=0; for($i=0;$i<sizeof($Data);$i++){ $line=explode(",",$Data[$i]); #表示ページの果物とCSVのline1が違い、価格が$priceよりも小さいものを3件まで表示 if($fruits != line1 and $price >= line2 and $j<3 ){     echo $line1 $line2.' </br>'; $j++; } } ?> で、価格が低いものを3件まで表示することはできました。 ぶどう200円のページであれば、 2,なし,150(円) 3,りんご,100(円) 4,バナナ,80(円) が表示されるようにはできました。 りんご100円のページには、 4,バナナ,80(円) 5,みかん,50(円) の2件のみが表示されています。 上記りんごのように、安いものが3件なかった場合に、 それより価格が高いが一番近いものから順に3件になるまでデータを 取りだしたいと思っています。 今回のりんごであれば、リンゴより安い、バナナ80円、みかん50円、 それに加え、リンゴより高いがリンゴの価格に一番近い、なし150円を表示させたいです。 みかんの場合には、安いものがないため、高いがみかんに近いものから3つ 2,なし,150(円) 3,りんご,100(円) 4,バナナ,80(円) を表示させたいです。 一体どうしたら良いのか、検討も付かず、教えて頂きたいです。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • SQLでグループ化して降順表示がうまくいきません

    個人的にMysql、php環境でサイトを作っております。 そこで、素人質問で申し訳ありませんが、SQLでお伺いしたい点があります。 例えば下のようなテーブルがあります。 ▽果物テーブル 果物ID | 果物名 | 売れた日付 1 | リンゴ | 2008/11/1 2 | みかん | 2008/11/2 3 | みかん | 2008/11/3 4 | リンゴ | 2008/11/4 これを、 『最近売れた』果物順に、『グループ化』して並べ替えたいと思い、 下記のようなsqlを組みました。 $sql = "SELECT 果物名, FROM 果物テーブル GROUP BY 果物名 ORDER BY 売れた日付 DESC"; 意図としてはリンゴ、みかんの順に並べ替えたいのですが、 みかん、リンゴの順に表示されてしまいます。 想像では、グループ化したとき、古い日付の方が残ってしまい、 | リンゴ | 2008/11/1 | みかん | 2008/11/2 この部分を対象にして日付を降順にしてしまうからだと思うのですが、 これをうまく解決する方法が分かりません。 MSアクセスなどですと先に二重にクエリをかけるなどすることで 「先に降順で並べ替えたクエリを出し、その後グループ化させる」 など処理が簡単なのですが、phpではどうするのかいまひとつ分からず・・・ 申し訳ありませんがよろしくお願いします。

    • ベストアンサー
    • PHP
  • 環境PHP5 Apache2.0 SQLite

    環境PHP5 Apache2.0 SQLite データベースSQLiteに関する質問なのですが、データベース名、テーブル名のみ解っている状態からテーブルで使用されている項目の一覧などは取得できますでしょうか? データベース名 くだもの テーブル名 くだもの リンゴ バナナ イチゴ  1   3   2  このようにテーブルのみ解っている状態から中身を見ずに項目「りんご」、「バナナ」、「イチゴ」を取得したのです。SQLiteで無くとも、他のデータベースで可能でしたらご教授ください。よろしくお願い致します。

    • ベストアンサー
    • PHP
  • メールの本文にテーブルのデータを書き込む

    ご質問させて頂きます。 access2000、ADOを使用しています。 Aテーブルに以下のようなデータがあります。 1 りんご 2 バナナ 3 みかん このデータを使って 以下のようなメールをお送りしたいのです。 ----------------- 件名 果物について 本文 お世話になっています。 果物について以下の通りです。 1 りんご 2 バナナ 3 みかん ----------------- ご教授して頂けたら幸いです。

  • 初心者です。Access レポートで下記のように作成したいのですが、な

    初心者です。Access レポートで下記のように作成したいのですが、なんか重複データで引っかかってしまいました。 ※(1)作成したいレポート 分類   名前     地名    小計   合計   総合計 -------------------------------------------------- 果物   りんご   青森   100    170   1070               千葉    50               山梨   20      バナナ   千葉   450    450      みかん   栃木   300     450                     150 ---------------------------------------- ワイン   AAAA   ドイツ   500    800    1000            イタリア   300       BBBB    ドイツ   200   200 ↓↓   ↓↓   ↓↓   ↓↓   ↓↓  ↓↓ ※(2)クエリで下記のようなデータがあります。 分類   名前     地名    小計   合計   総合計 -------------------------------------------------- 果物    りんご    青森    100    170    1070 果物   りんご    千葉    50    170    1070 果物   りんご   山梨   20   170   1070 果物   バナナ   千葉   450    450    1070 果物   みかん   栃木   300   450    1070 果物   みかん    栃木   150   450    1070 -------------------------------------------------- ワイン  AAAA  ドイツ   500    800    1000 ワイン  AAAA  イタリア  300   800   1000 ワイン  BBBB  ドイツ   200   200   1000 ↓↓   ↓↓   ↓↓   ↓↓    ↓↓    ↓↓ (1)レポートで      フィールド[分類]:重複非表示 [はい]      フィールド[名前]:重複非表示 [はい]      フィールド[合計]:重複非表示 [はい]      フィールド[総合計]:重複非表示 [はい]にすると下記の様になってしまいしますが、 分類   名前     地名    小計   合計   総合計 -------------------------------------------------- 果物   りんご   青森   100    170   1070               千葉    50               山梨   20      バナナ   千葉   450    450      みかん   栃木   300                     150 ---------------------------------------- ワイン   AAAA   ドイツ   500    800    1000            イタリア   300       BBBB    ドイツ   200   200 ↓↓   ↓↓   ↓↓   ↓↓   ↓↓  ↓↓ 結果的に上記(1)の様にしたいです。名前のフィルドにバナナ、みかんなどの合計はそれぞれ450と450を表示させたいのですが、たれかその方法は教えて頂けないでしょうか。よろしくお願いします。

  • チェックボックス(複数選択可)の値をPOST送信し、

    果物テーブルの中身を入力フォームにて、チェックボックスにより選択 得られた果物コードをSELECT文により、果物名に変換して表示 保存時は好きな果物1、好きな果物2、好きな果物3、、カラムにコードを保存。 例)あなたの好きな果物は? りんご  みかん  いちご  メロン (チェックボックスにより選択) 果物テーブル: 1 りんご 2 みかん 3 いちご 4 メロン 入力フォームよりPOSTにて選択された果物のコードを送信 入力確認画面にて得られたコードより果物名に変換 選択されたコードを保存 上記のようなイメージです。 例えば、りんご、みかん、いちごを選択された場合、(1,2,3)が得られ、これを分解してSELECTする方法が分かりません。 すなわち配列の操作になるかと思われます。 (1,2,3)コードは取得出来ています。 以上、ご教授頂けたら助かります。

    • ベストアンサー
    • PHP

専門家に質問してみよう