phpでCSVデータを読み書き後表表示させる方法

このQ&Aのポイント
  • PHP初心者の方がCSVデータを読み書きし、ブラウザに表形式で表示したいです。
  • PHPバージョン5.3.1とXAMPPバージョン2.5.8を使用しています。
  • Access2007で出力したCSVファイルを加工して表示したいのですが、うまく進めることができません。
回答を見る
  • ベストアンサー

php csvデータを読み書き後表表示させたい

PHP初心者です。 色々調べ、試したのですがなかなか完成まで辿りつけないので、どなたかお力添えお願い致します。 PHP バーション 5.3.1 XAMPP バージョン 2.5.8  OS Win XP SP2 access2007を使用し、以下のようなCSVファイルを出力しました。 それを、phpで加工後ブラウザに表示させたいのです。 csvのデータ "メーカCD","メーカー名","MRCD","棚番","品目CD","品目名","規格","繰越数","出荷","入荷","残","ITEM_C","実績テーブル集計(移動出入仕入売上)のクロス集計_sort","2010/10/01","2010/10/02","2010/10/03",  」 ここまでがタイトル行 ここから明細「"1 ","○○フーズ ","00200", "A101","15 ","くね","45g5" ,3.00,3.00,0.00,0.00,"15615 ","売上"1.00,,1.00" これを正表して、 |メーカCD| メーカー名| MRCD|棚番|CD|品名|規格|繰越|出荷|入荷|残|区分|10/1|10/2|10/3| |1 |○○フーズ|00300  |A101|15 |くね |45g5|3 |3 | 0|0 |売上 |   |3 | | の様な表にしたいです。 まず、初めに <?php //$filename変数にどのファイルかを割り当てる。 $filename = "c:\\xampp\\htdocs\\hi.csv"; $handle = fopen($filename,"r"); $contents = fread($handle, filesize($filename)); fclose($handle); $fp=str_replace("実績テーブル集計(移動出入仕入売上)のクロス集計_sort", "区分", $contents); $line = explode(",", $fp); echo "<table cellpadding='4' cellspacing='1' border='1';><tbody>"; for ($a = 0;$a < count($line); $a++) { $data = split("\t", $line[$a]); echo "<tr>"; if ($a == 0) $style = 'background-color : #e5e5e5;'; else $style = 'background-color : #ffffff;'; for ($b = 0; $b < count($data); $b++) echo'<td style="' . $style . '">' . $data[$b] . '</td>'; echo '</tr>'; } echo '</tbody>'; echo '</table>'; ?> とスクリプトを書き、CSVデータのタイトル行"実績テーブル集計(移動出入仕入売上)のクロス集計_sort"をstr_replaceを使用し”区分”への変更し、そのあと表として表示させてみようと思ったのですがうまく出来ません。 最終的には、「"」も消し、いらない空白も消し「"2010/10/02"」→は「10/2」に変更したいのですが先に進めない状態です。

  • PHP
  • 回答数3
  • ありがとう数5

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

提示のcsvデータの仕様が変、転記ミスだと思います。 たとえばこんな感じでやるといいです。 (なお、スタイル設定はスタイルシートを分けた方が効率的) <style> thead th{ background-color : lime; } tbody td{ background-color : yellow; } </style> <? $filename="x.csv"; $handle = fopen($filename, "r"); $headflg=true; $count=0; $thead=""; $tbody=""; while (($row = fgetcsv($handle,1024, ",")) !== FALSE) { if($count===0){ $thead="<tr>\n"; foreach($row as $val){ $val=htmlspecialchars($val); if($val==="") $val="&nbsp;"; //空欄の整形 if(preg_match("|\d{4}/\d{2}/\d{2}|",$val)) $val=date("n/j",strtotime($val)); //日付の整形 if($val==="実績テーブル集計(移動出入仕入売上)のクロス集計_sort") $val="区分"; //特定文字の整形 $thead.="<th>{$val}</th>\n"; } $thead.="</tr>\n"; }else{ $tbody.="<tr>\n"; foreach($row as $val){ $val=htmlspecialchars($val); if($val==="") $val="&nbsp;"; //空欄の整形 if(preg_match("/^(\d+?)\.00$/",$val,$match)) $val=$match[1]; //数値の整形 $tbody.="<td>{$val}</td>\n"; } $tbody.="</tr>\n"; } $count++; } fclose($handle); $table=""; $table.="<table>\n"; $table.="<thead>\n".$thead."</thead>\n"; $table.="<tbody>\n".$tbody."</tbody>\n"; $table.="</table>\n"; print $table; ?>

momo705
質問者

お礼

ありがとうございました!! 早速、スクリプトをコピーして実行したところ出来ました。 csvはコピペしたものはデータが多すぎてたので適当に削った為おかしく表示されてしまってました。すみません・・。 スタイルシートを使うことは全く思いつきませんでした。 丁寧に教えて頂きましてありがとうございました。

その他の回答 (2)

  • kool_noah
  • ベストアンサー率33% (95/285)
回答No.3

//$filename変数にどのファイルかを割り当てる。 $filename = "c:\\xampp\\htdocs\\hi.csv"; $handle = fopen($filename,"r"); echo "<table cellpadding='4' cellspacing='1' border='1'>"; while ($array = fgetcsv($handle)) { echo '<tr>'; foreach ($array as $key => $val){ $val = mb_convert_encoding($val, "utf-8","shift-jis"); $val = str_replace("実績テーブル集計(移動出入仕入売上)のクロス集計_sort", "区分", $val); if ($val == "") echo '<td>&nbsp;</td>'; echo '<td>' . $val . '</td>'; } echo '</tr>'; } fclose( $handle );

momo705
質問者

お礼

すべてスクリプトを書いて頂きありがとうございました。 早速試したところ、当初目的としていた部分はクリア致しました。お世話になりましたー。

  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.2

何も考えていない俺が、このソースを読んで、実証もせずに感じた違和感を書き出してみます。 ----- この三行 は $handle = fopen($filename,"r"); $contents = fread($handle, filesize($filename)); fclose($handle); ↓でいいんじゃなかろうか・・・? $contents = file_get_contents($filename); ----- $contents の中身って CSVファイルを 文字列に入れてるだけなので、$line = explode(",", $fp); したら おかしな事になるんじゃ・・・? 例えば、一行に5項目あるカンマ区切りが3行あるとしたら、$lineの中身は 15個の一次元配列になる。(各改行の手前はカンマで終わってるものとして) ---- で 更に $data = split("\t", $line[$a]); で タブ区切り??? タブは どこから出てきたのか・・・? ---- 俺の中の脳内実行の結果、これって縦に だーーーーっと並んだだけの表になってません?

momo705
質問者

お礼

御指摘ありがとうございます。 私も脳内実行が出来ればいいのですが・・今はひとつひとつ、こうするとこのような結果になるな・・と確かめている状態です。 おっしゃる通りの結果になりました。 どうしてそうなるのかわからなったのですが、なんとなく理解出来ました。 独学で学んでいるのでよくわからないまま、いきずまってしまったところでした。

関連するQ&A

  • PHPでCSVデーターの表示について

    PHPでCSVデーターの表示について 教えてください。PHPでCSVデーターを表示したいのですが一覧表示ではなくテキストをクリックして特定のデーターを表示させようと考えております。 CSVデーターの中身(CSV.csv) 一郎,男,20歳 二郎,男,22歳 一子,女,24歳 二子,女,26歳 --data.php-- <?php $csvFile = 'CSV.csv'; $tempCSV = file_get_contents($csvFile); $tempCSV = mb_convert_encoding($tempCSV,'utf-8','SJIS-win'); $fp = tmpfile(); fwrite($fp,$tempCSV); rewind($fp); setlocale(LC_ALL,'ja_JP.UTF-8'); while ($arr = fgetcsv($fp,1024)) { list ($name,$sex,$age) = $arr; echo '<p>',<a href="01.php">' . $name . '</a>','</p>'; } fclose($fp); function h($string) { return htmlspecialchars($string, ENT_QUOTES); } ?> 一郎をクリックしたら一郎のデーターだけを(01.php)で表示させたいのですがよく分りません。 01.phpは今のところ一覧表示されるものを置いてあります。 --01.php-- <?php $csvFile = 'CSV.csv'; $tempCSV = file_get_contents($csvFile); $tempCSV = mb_convert_encoding($tempCSV,'utf-8','SJIS-win'); $fp = tmpfile(); fwrite($fp,$tempCSV); rewind($fp); setlocale(LC_ALL,'ja_JP.UTF-8'); while ($arr = fgetcsv($fp,1024)) { list ($name,$sex,$age) = $arr; echo '<table border=1>'; echo '<tr>'; echo '<td>','名前','</td>'; echo '<td>'.$name.'</td>'; echo '</tr>'; echo '<tr>'; echo '<td>','性別','</td>'; echo '<td>'.sex.'</td>'; echo '</tr>'; echo '<tr>'; echo '<td>','年齢','</td>'; echo '<td>'.$age.'</td>'; echo '</tr>'; echo '</table>'; } fclose($fp); function h($string) { return htmlspecialchars($string, ENT_QUOTES); } ?> 本を読んだり、ググったりしてヒントになる様な物を探しているのですが中々見つかりません。 初心者で申し訳ありませんが、どなたか教えていただけないでしょうか?

    • ベストアンサー
    • PHP
  • PHPとCSVの表示 もっとスマートにしたい

    現在PHPに手を出し始めた初心者です まだ分からない事だらけですが、できれば教えてください CSVファイルからデータを読み込んで表示するということを 苦戦しながらやっております ただ、1つのPHPファイルだけでの表示方法がわからず、今は3つのPHPファイルにしています 目的は大区分を選択後、小区分の一覧が表示され、小区分の1つを選択すると詳細が表示される という感じのものです まずCSVファイル 大区分,小区分,名称,詳細 1,101,hoge1,詳細1 1,102,hoge2,詳細2 2,201,hogex1,詳細x1 2,202,hogex2,詳細x2 3,301,hogexx1,詳細xx1 という感じに分けています で1つ目のhoge0.phpで <a href="hoge1.php?code=1">大区分(1)</a> ・・・ code が 1 なら hoge1.php で 小区分 1 の一覧を表示します 次に2つ目のhoge1.phpで $code = $_GET['code']; $lines = file('hoge.csv'); foreach($lines as $line) { $line = rtrim($line); list($bno,$sno,$name,$detail) = explode(",", $line); if ($bno==$code) { echo "<a href=hoge2.php?type=$sno>詳細</a>".$name."<br>"; } } type が 101 なら hoge2.php で 小区分 101 にある hoge1 項目の詳細を表示します 最後3つ目のhoge2.phpで $type = $_GET['type']; $lines = file('hoge.csv'); foreach($lines as $line) { $line = rtrim($line); list($bno,$sno,$name,$detail) = explode(",", $line);{ if ($no==$type) { echo $name.$detail; } } } 一応これでやりたい事は実現できたのですが、あまりにも不恰好で・・・ これを1つのPHP内で処理できるようにするにはどうしたらいいでしょうか? スマートになるやり方があれば教えてください

    • ベストアンサー
    • PHP
  • CSVファイルを読み込んで表示するPHP

    <?php setlocale(LC_ALL, 'ja_JP'); if( $handle = fopen( 'data.csv', 'r' ) ){ echo '<table border=1 cellspacing=0 bordercolor=#ff6600 align=center>'; if( ( $data = fgetcsv( $handle ) ) !== FALSE ){ echo '<tr style="background-color:#FFCCFF">'; for( $i = 0; $i < count( $data ); $i ++ ){ if($i===0){ echo '<td align=center width=160px>' . $data[$i] . '</td>'; }else{ echo '<td align=center width=60px>' . $data[$i] . '</td>'; } } echo '</tr>'; } while( ( $data = fgetcsv( $handle ) ) !== FALSE ){ echo '<tr>'; for( $i = 0; $i < count( $data ); $i ++ ){ echo '<td align=center>' . $data[$i] . '</td>'; } echo '</tr>'; } echo '</table>'; } fclose($handle); ?> ■data.csvの内容 品名,数量,予備 AAA,1,1 BBB,1,1 CCC,1,1 上記のPHPは2列まで表示されるようになっています。 それを3列まで表示できるようにしたいのですが、 初心者なので、どう記述したらいいのか分かりません。 どうか、ご教授お願いします。

    • ベストアンサー
    • PHP
  • CSVファイルのダウンロード方法について

    CSVファイルのダウンロード方法についてご教授願います。 (いろんなサイトやFAQをみてきましたが、いまいちわからなかったのでここで質問させていただきます。) 現在、 (1)アンケート項目データ採取.cgi(集計プログラミング込み)…ブラウザ上表示はではcgiにhtmlテンプレートを読み込み ↓ (2)集計.CSVにてデータ集計 ↓ (3)検索.cgiにて(2)集計.CSVのソートや詳細の検索ができる ---------- 他、(4)修正phpがあり、(2)集計.cgiを集計できます。 ---------- (1)、(3)、(4)各ページで<a href="***/***/集計.csv">_CSVダウンロード_</a>なるものをリンク表記したのですが、ダウンロードできません。 どうしたらよいでしょうか?

    • 締切済み
    • CGI
  • CSVデータを使ったページングとソート

    phpをやり始めて3ヶ月くらいですが、高度な事がまだまだわかりません。どなたかお知恵を拝借願えないでしょうか? fgetcsvを使って一覧表示をしidからそのデータの詳細をsyousai.phpへ送って表示するようにしています。 この一覧表示にページングとソート機能をつけたいのですが、どうやったらよいかわかりません。 <? $fname = "list.csv"; $file = fopen($fname, "r"); while (list( $data0, $data1, $data2, $data3, $data4) = fgetcsv($file, 1000, ",")) { ?> <table> <tr> <td> <form action="syousai.php" method="get" name="code"> <a href="syousai.php?id=<? echo $data0;?>" name="id">詳細</a> </form> </td> <td>番号:<? echo $data0;?></td> <td>名前:<? echo $data1;?></td> </tr> </table> <? } ?> <? fclose($file); ?> と、言うようなソースです。 こんなやり方でいいのかも不明ですがこの中にページングとソートの機能を追加したいと思っています。

    • ベストアンサー
    • PHP
  • 例えばPHPで下記のようなdata.csvがあります

    例えばPHPで下記のようなdata.csvがあります NO,種類,入荷日,出荷日 1,りんご,2010/06/10,2010/06/30 2,みかん,2010/03/10,2010/04/30 3,かき,2010/05/10,2010/05/30 ・ ・ ・ これらをPHPで読み込んできて入荷日順に10件ずつ表示するプログラムを書きたいのですが 本も三冊買ってきたり、掲示板のソースとかをみて参考にできるかと思ったりしたのですが当方初心者でしてどうも難しく行き詰っております。 data.csvから1行ずつ取り込んできて、3番目の数字でソートするといいというのは分かるのですが どうもその方法がわかりません。 何かアドバイス頂ければ幸いです。

    • ベストアンサー
    • PHP
  • PHPでCSVファイルのデータを表示したところ日本語が表示されません

    PHPで、CSVファイルの中身を表示させようと思ったのですが、一部の日本語が正しく表示されません。 問題のPHPとCSVファイルの内容を明記します。アドバイスお待ちしております。 PHP <html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <title>tokuten</title> </head> <body> <TABLE border="1"> <TBODY> <TR> <TD>ID</TD> <TD>名前</TD> <TD>点数</TD> </TR> <?php $fname = "name.csv"; $fp = fopen($fname, "r"); while (list($id, $name, $point) = fgetcsv($fp, 100, ",")) { echo"<TR>"; echo"<TD>".$id; echo"</TD>"; echo"<TD>".$name; echo"</TD>"; echo"<TD>".$point; echo"</TD>"; echo"</TR>"; } fclose($file); ?> </TBODY> </TABLE> </body> </html> CSV 1,a,50 2,b,70 3,c,100 55,松井,55 530000,フリーザ,530000

    • 締切済み
    • PHP
  • JS(ajax)でphp(csv)の読み込み

    こんにちは。 Javascriptのご教授お願いしたく、書き込みました。 今JavascriptでAjaxを使って、CSVを読み込むPHPを実行しています。 PHPでは、CSVを読み込み(readcsv.php)、その結果を別のファイル(alert.html)に受け渡しています。 問題が、読み込んでいるJavascript側でもデータを一つ一つ取得したいですが、 方法が分かりません。ご教授お願いします。 構成 : alert.html(Javascript), readcsv.php, test.csv コード構成 : -------------------------------------------------------------------------- alert.html <script type="text/javascript"> $.ajax({ type: "POST", url: "readcsv.php", success: function(printString) { alert(printString); --> ここをどうするべきか悩んでいます。 }, error:function(){ alert("error"); } } ); </script> ------------------------------------------------------------------------------- readcsv.php <?php $filename = "test.csv"; $row = 1; $rowS = 1; if (($handle = fopen($filename, "r")) !== FALSE) { while (($data = fgetcsv($handle, 1000, "*")) !== FALSE) { $num = count($data); $row++; for ($c=0; $c < $num; $c++) { $String = explode(",", $data[$c]); foreach ($String as $AllString) { echo $AllString."\n"; } echo "\n"; } } fclose($handle); } ?> ---------------------------------------------------------------------------- test.csv 1,2,3,4,6,8*9,1,2,3,5,7,2,1,3,5*7,2,1,2,3,5,7,2*1,5,3 ---> 数字の羅列(コンマ区切り) ---------------------------------------------------------------------------- です。 一番問題になっているところは、 alert.html の alertのところで、 readcsv.php から受け取った値を一つ一つ変数に格納したいところです。 ご教授お願いします。

  • phpでcsvデータをランダム表示について

    下記はcsvデータをランダムに1つだけ抽出するphpのプログラムですが、1度表示したデータに色をつけるとか、表示させない方法はありますか? <!doctype html> <html> <head> <meta charset="UTF-8"> <title>無題ドキュメント</title> </head> <body> <?php // 抽出数 $count = 1; $list = array(); // 読み込みCSVファイル $lines = file('test.csv'); shuffle($lines); foreach ($lines as $line) { if ( ! in_array($line, $list)) { array_push($list, $line); if (count($list) >= $count) { break; } } } // CSVファイルに出力 $file = fopen('test2.csv', 'w'); foreach ($list as $l) { echo $l.'<br>'; if ($file) { fputs($file, $l); } } fclose($file); ?> </body> </html>

    • ベストアンサー
    • PHP
  • CSVデータ作成

    先方にCSVデータを送信しなければなりません。その際 ある部分の区分を 3桁で 000 もしくは 111 を入力する必要があります。また 単価の列には 00123.00 とこのようなデータで下さいと言われたのですが、これは編集ではなく 関数で =TEXT(A1,"000") とか =TEXT(A1,"00000.00") とすればいいのかなと思うのですが これを CSVに変換すると 区分は 0 単価は123になってしまいます。CSVで 000 や 000123.00 にすることはできないのでしょうか。 教えてください。宜しくお願いします。

専門家に質問してみよう