• ベストアンサー

CSVファイル一覧の際、ファイルのデータで異なる画

CSVファイルがあります。 1行目 北海道,HOKKAIDO,2 2行目 東北,TOHOKU,1 3行目 以下いろいろと続く 上記のようなCSVファイルがあり、HTMLでTABLEタグを使用してTRごとファイルの1行分を展開して全部を表示させたいのです。 ただ、末尾のデータが1の場合は一階層下のimgディレクトリにあるAの画像を表示し、2の場合は同様にBの画像を表示させ、それぞれALT属性で北海道や東北のようにCSVの最初のデータを入れたいのですがやり方が分かりません。 ちなみに末尾のデータは1か2のみです。 ご教示いただければ幸いです。

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

  • ベストアンサー
noname#244856
noname#244856
回答No.3

ASCIIコードの並び、具体的には A → 65 B → 66 であることを利用するとシンプルに書けますねww setlocale(LC_ALL, 'ja_JP.UTF-8'); if ($fp = fopen('data.csv', 'rb')) {  echo '<table>' . PHP_EOL;  while ($row = fgetcsv($fp)) {   if (count($row < 3)) {    continue;   }   echo '<tr>' . PHP_EOL;   echo '<td>' . $row[0] . '</td>' . PHP_EOL;   echo '<td>' . $row[1] . '</td>' . PHP_EOL;   printf(    '<td><img src="img/%s.jpg" alt="%s"></td>' . PHP_EOL,    chr(64 + $row[2]),    $row[0]   );  }  echo '</table>' . PHP_EOL; } ・OKWave上でコードが読みやすいように全角スペースでインデントしています。 ・出力されるHTMLコードが読みやすいように適当にタグの末尾で改行しています。 ・CSVファイルの文字化け問題に配慮しています。 Pentan.info - fgetcsv関数を文字化け対応 setlocaleの文字コード指定 http://pentan.info/php/fgetcsv_char.html <img>とするか<img />とするかについては、自分がHTMLを書いているのかXHTMLを書いているのかを考慮してどちらかに統一させてください。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

noname#244856
noname#244856
回答No.4

ごめんなさい、printfの後にtrの閉じタグ入れ忘れました… あと…入力データにHTMLタグなどが含まれる可能性がある場合、htmlspecialchars関数を通してからechoしなければいけません。 PHP Manual - htmlspecialchars http://www.php.net/manual/ja/function.htmlspecialchars.php 毎回この関数を書くのは面倒なので、 function h($str) {  return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); } として1文字で呼べる関数を用意しておくと非常に便利です。

全文を見る
すると、全ての回答が全文表示されます。
  • agunuz
  • ベストアンサー率65% (288/438)
回答No.2

>末尾のデータが1の場合は一階層下のimgディレクトリにある >Aの画像を表示し、2の場合は同様にBの画像を表示させ、 >それぞれALT属性で北海道や東北のようにCSVの最初の >データを入れたい Aの画像とかBの画像というのは、どこで決まるのでしょうか?1, 2, 3・・に従って、A, B, C なのでしょうか(それにしても拡張子もわからないし)。 (わからないので)ソースに直接書くならこんな感じですかね。 while ($row = fgetcsv($fp)) { if (count($row) < 3) { continue; } echo '<tr>'; echo '<td>' . $row[0] . '</td>'; echo '<td>' . $row[1] . '</td>'; $sw = intval($row[2]); switch $sw { case 1: echo '<td><img src="img/A.jpg" alt="' . $row[0] . '" /></td>'; break; case 2: echo '<td><img src="img/B.jpg" alt="' . $row[0] . '" /></td>'; break; default: echo '<td></td>'; } echo '</tr>'; } 値と画像名の関連付けは配列で保持しておいた方がいいとは思いますけどねww

kaitom
質問者

お礼

参考にさせていただきます。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

ざっとこんなフローでよいのでは? ただしCSVの文字コードとphpファイルの文字コードを合わせないと うまくいかないかもしれません <?PHP print "<table border=1>\n"; print "<tbody>\n"; if (($handle = fopen("test.csv", "r")) !== FALSE) { while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { print "<tr>\n"; foreach($data as $key=>$val){ if($key==2){ $alt=htmlspecialchars($data[0]); $src=($val==1)?"img/a.jpg":"img/b.jpg"; $txt="<img src=\"{$src}\" alt=\"{$alt}\">"; }else{ $txt=htmlspecialchars($val); } print "<td>{$txt}</td>\n"; //print "<td>".htmlspecialchars($txt)."</td>\n";//チェック用 } print "</tr>\n"; } fclose($handle); } print "</tbody>\n"; print "</table>\n";

kaitom
質問者

お礼

ありがとうございました。 参考にさせていただきます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • CSVファイルをダウンロードさせたい。

    こんにちは。 見よう見まねでダグ打ちをやっています。 CSVファイルをダウンロードさせたいのですが、ダウンロード画面にならずに、 直接テキストが表示されてしまいます。 PC上のテストではOKなのですが、HPではうまくいきません。 どうぞ、よろしくお願いします。 <html> <head> <title>データーダウンロードメニュー</title> </head> <body> <center> <table border="1"> <tr> <td> <br> <b>データーリスト</b> </td> <tr> <td> <br> <A HREF="TopMenu.html">メニューに戻る</A><br> <br> <br> <A HREF="mokuzai/LOG10_20051225.csv">LOG10_20051225.csv</A> </td> </tr> </table> </center> </body> </html>

    • ベストアンサー
    • HTML
  • csvデータをテーブル表示させる

    再び新規質問で申し訳ありません これしか方法がわからなかったもので; csvデータから最初の項目に5というものが含まれている場合 その列を表示する、というのを先ほど質問させていただいて解決に至りました。 csvデータファイルの内容 5,データ1,データ1の説明 5,データ2,データ2の説明 5,データ3,データ3の説明 6,データ4,データ4の説明 ・・・ ↓ open(IN, "data.csv"); while (<IN>) { if ((split(/,/))[0] == 5) { print $_. "\n"; } } close(IN); これで最初の欄に5が含まれている列だけ表示されるのですが htmlに出力すると、そのまま下記のように表示されます 5,データ1,データ1の説明 5,データ2,データ2の説明 5,データ3,データ3の説明 これでは余りにみずらいので、以下のように変更しました open(IN, "data.csv"); print "<table>"; while (<IN>) { if ((split(/,/))[0] == 5) { print "<tr><td>". $_. "</td></tr>"; } } </table> close(IN); これで少しは見やすくなったのですが・・・ ↓のように。 5,データ1,データ1の説明 5,データ2,データ2の説明 5,データ3,データ3の説明 この,で区切られた部分も</td><td>で表示したいのですがうまくいきません。 先ほど質問した時に教えていただいたURLを参照しましたがサッパリでした; 検索で、csvファイルをリストに格納して print "<table><tr>"; print "<td>$data_view[0]</td>"; print "<td>$data_view[1]</td>"; print "<td>$data_view[2]</td>"; print "</tr></table>"; と表示させれば良い、という記事をみつけたのですが これをすると 先ほど成功した最初のデータに5が一致した分だけ表示させる、という部分が機能しませんでした;; まだまだ勉強不足かとは思いますが何卒お願い致します

    • ベストアンサー
    • Perl
  • PHPでcsvファイルを一覧表示するにはどうすれば良いのでしょうか?

    <?php //ファイルを開く $fp = fopen('maillog.csv', 'r') or die('ファイルが開けません'); //テーブルを出力 echo '<table border="1">'; while ($field_array = fgetcsv($fp, 10000, ',', '"')) { echo '<tr>'; foreach ($field_array as $value) { echo '<td>'.htmlspecialchars($value, ENT_QUOTES).'</td>'; } echo '</tr>'; } echo '<table>'; //ファイルを閉じる fclose($fp); ?> プログラムだと、全ての項目が表示されてしまうので 少ない項目(3~4つ)で表示できるにはどうすれば良いのでしょうか? また、各項目毎のタイトルも付けたいのですが お願いします。

    • 締切済み
    • PHP
  • csvファイルのデータを変数として取込むには?

    javascriptは1年生です^^ データバインドを利用して、テーブルにデータを表示しています。 document.write("<object id='setData' classid='clsid:333C7BC4-460F-11D0-BC04-0080C7055A83'>"); document.write("<param name='DataURL' value='setdata.csv'>"); document.write("<param name='UseHeader' value='true'>"); document.write("</object>"); document.write("<table border='1' datasrc='#setData'>"); document.write("<tr>"); document.write("<td><span datafld='data1'></span></td>"); とこんな感じで続くのですが、csvファイルのデータには、セル幅や背景色等の設定値も含まれています。 これらのデータは表示用のデータではないので、変数として取込まなければなりません。 普通なら、bodyタグの中に、 <input type="hiden" datafld="optionData1"> と書いて、そこからjavascriptで取込むことは可能ですが、document.writeを使うとbodyタグの中が書き換わってしまうので使えません。 (csvファイルの1行分のデータを、HTMLのテーブルで表示する時には、4行~6行と行数が変動するので、予めテーブルをbodyタグの中に書いておくことが出来ません。テーブル行数はスクリプト内で決定するので。なのでbodyタグの中は空でオールjavascriptでHTMLを生成しています) もう一つの方法はフレームを使って、parentで、データを送ることも考えたのですが、もっとスマートな方法はないでしょうか??

  • csvファイルを配列へ格納しブラウザへ出力

    <?php #CAT csvファイルを開く $fp_c = fopen("test.csv","r"); #domain csvファイルを開く $fp_domain = fopen("test.csv","r"); print "<table border='1'>"; #fgetcsv関数がfalseを返却するまで実行 while($c_data = fgetcsv($fp_c)){ print "<tr>"; #csvファイルの列数だけ実行 for($i=0;$i<count($c_data);$i++){ print "<td>".$c_data[$i]."</td>"; } print "</tr>"; } print "</table>"; var_dump($c_data); fclose($fp); ?> このようなプログラムをつくってcsvファイルの各セルを配列$c_data[$i]へ格納している(つもり) なのですが、var_dump($c_data);を入れると bool(false)と表示されてしまいます。 このプログラムではcsvファイルの中身を表示できても配列に格納されていないのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • CSVデータの行数カウントをしたいのですが・・

    CSVデータの行数カウントをしたいのですが・・ どうしたらよいでしょうか? 目的は <tr> <td><?=$奇数行のデータ?></td> <td><?=$偶数行のデータ?></td> </tr> のように 2列のテーブルに奇数行と偶数行を出力させるためです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • CSVファイルの最終行のデータを取り出したい

    PHPでCSVファイルのデータを取り込もうとしています。 全てのデータを表示させるのであれば、「while」などを使って書くのが一般的かと思うのですが、 最終行のデータ(「,」で区切られた最も左のフィールド)だけを取り出したいので、 以下のように書いてみました。 <?php $file = fopen("hoge.csv","a+"); $nakami = fgetcsv ($file, 1000, ","); echo $nakami[0]; fclose($file); ?> 「fopen」のmodeについて、「r」にすれば先頭から読み込まれ、 「a+」もしくは「ab+」ならばファイルの終わりにポインタが来る・・・ と色々なマニュアルに書かれていましたので、上記のようにしてみたのですが、 $nakami[0]で表示されるのは、1行目の最左列のデータになってしまいます。 1)このやり方(modeの設定)では最終行のデータ取得は不可能なのか 2)どのようなやり方なら最終行のデータ(のみ)は取得できるのか お知恵をお借りできれば幸いです。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • CSVファイルの行が突然消える

    あるデータを抽出し、それをCSVファイルで取り込み、1つ取り込む ごとにCSVファイルが1行ずつ増えていきます。 適当な時期に、何行かたまった行を一気にAccessを用いてさらに取り込み ます。(取り込むのみ) あるとき、CSVファイルを開くと突然CSVファイルの行が減って いるのです。 何が起きているのでしょうか? Accessに何かマクロとか組んであって突然消えるのでしょうか? Accessを開く前と開いた後(取り込んだ後)で、特にCSVファイル に変更はありません。 あるとき突然CSVファイルを開くと昨日まであった行が突然 消えてしまうのです。(いつ起こるのか予測できていません。) CSVファイルにはマクロが組んであるようには見えません。 何かわかればお願いします。

  • csvファイルについて

    javaで、csvファイルを読み取り、データベースにいれるツールを作成しています。 csvファイルを読み込む部分でつまづいてしまったので、どなたかご教授ください! 指定されたcsvファイルを一行ずつ取り込むのですが、一つの情報が2行以上になってしまうデータがいくつかあり、ファイルチェックとして、1つ目のカラムは何文字のものだとかしているけれども、その前の行の続きに当たる行が、その条件から外れてしまい、エラーになってしまいます。(当たり前ですが、、、) なぜ、csvファイルが一行に収まらないのかが、わかずですし、それを一行として読み込むことができるのかが不明で困っております。   原因や対処法が分かれば、教えていただければと思います。 よろしくお願いします。

  • CSVファイルからの読取について

    よろしくお願いします。 データバインドを利用し、CSVファイルにて画像名を記入し、それを 表示させるスクリプト例をこのカテゴリで拝見し、試してみました。 問題なく表示できたのですが、CSVファイルのレコード数分、どうしてもループして表示されます。レコード数分ループしないようにするには どこを注目すればよろしいでしょうか? 以下が参考して、若干手を加えたソースです。 ------------------------------------------------------------ <html> <head> <title>TEST CSV IN</title> </head> <body> <object id="TEST" classid="clsid:333C7BC4-460F-11D0-BC04-0080C7055A83"> <param name="DataURL" value="sample.csv"> <param name="UseHeader" value="true"> </object> <script language="JavaScript"> <!-- document.writeln("<table border=1 DATASRC='#TEST'><tr>"); TEST.Reset(); var rs = TEST.recordset; var Cnt = 0; while (rs.EOF == false){ if(Cnt++ % 3 == 0 && Cnt > 0) document.writeln("</tr><tr>"); document.writeln("<td><img src=" + rs.fields(0) + "></td>"); document.writeln("<td>" + rs.fields(1) + "</td>"); document.writeln("<td>" + rs.fields(2) + "</td>"); rs.MoveNext; } document.writeln("</tr></table>"); --> </Script> </body> </html> -------------------------------------------------- CSVファイルの内容は以下 img,name,phone img/a01.jpg,a01,001-001 img/a02.jpg,a02,002-002 img/a03.jpg,a03,003-003 img/a04.jpg,a04,004-004