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>
われながら荒業です。
↧