Quantcast
Channel: 配列タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 817

バッファリングで取得した改行を含むCSVファイルを配列へ

$
0
0
CSVファイルの読み込み⇒処理は、改行区切りで配列化するので、値に改行を含むと変なことになります。 新人が悩んでいたので、私も一緒に悩みました、確かに一筋縄ではいかないような… こういうCSVファイルのデータを HTMLフォームから送信して、 バッファリングして取得すると <?php //バッファリング ob_start(); include($_FILES['csvFile']['tmp_name']); //要素を取得 $csvData = ob_get_contents(); ob_end_clean(); ?> なぜか改行を含む値は " で囲まれる "a-1 a-2 a-3",b,c, それが原因かは不明ですが、「PHP CSV 改行」と検索して出てくる先人の解決策は、上手く行きませんでした。 CSVファイルをどこかにアップロードして、それを読み込めば上手く行く気がしますが、バッファリングが清々しくて好きです。 ゴタゴタしたコードで、後の災い・トラブルの元を埋め込んでしまうくらいなら、発想を転換して、運用・仕様を変えてしまいます。 独自・任意のセパレーターで配列にしてしまえばいいと思う <html> <body> <form method="post" enctype="multipart/form-data" action=""> <input name="csvFile" type="file" accept="text/csv"> <button type="submit">読み込み</button> </form> <?php //ファイルデータが存在する場合のみ実行 if (isset($_FILES['csvFile']['tmp_name'])) { //バッファリング ob_start(); include($_FILES['csvFile']['tmp_name']); //要素を取得 $csvData = ob_get_contents(); ob_end_clean(); //文字コード変換 $csvData = mb_convert_encoding($csvData, "UTF-8", "SJIS"); //行の配列(独自・任意のセパレーター区切り) $rowArray = explode("EOC", $csvData); echo " <table border=\"1\">\n"; //配列を再構成 $i = 0; while($i < count($rowArray) - 1){ echo " <tr>\n"; //列の配列( , 区切り) $colArray = explode(",", $rowArray[$i]); //列内データ整形 $j = 0; while($j < count($colArray) - 1){ //前後の空白削除 $colArray[$j] = trim($colArray[$j]); // " 削除 $colArray[$j] = str_replace("\"", "", $colArray[$j]); //HTML表示用処理 //改行を<br />に置換 $val = nl2br($colArray[$j]); //まだ残っている改行を削除 $val = str_replace("\n", "", $val); echo " <td>{$val}</td>\n"; $j++; } echo " </tr>\n"; $i++; } echo " </table>\n"; } ?> </body> </html> われながら荒業です。

Viewing all articles
Browse latest Browse all 817

Latest Images

Trending Articles