CSVの読み込み

CSVを読み込み、画面にテーブルで表示

CSV

1,Apple,リンゴ 2,Banana,バナナ (略) 7,Tennis,テニス 8,Basketball,バスケットボール

PHP

// CSV指定 $file_name = 'sample.csv'; // 存在チェック if (! file_exists($file_name)) { exit; } // 読込許可をチェック if (! is_readable($file_name)) { exit; } // CSV読み込み $contents = file_get_contents($file_name); // 文字コード $contents = mb_convert_encoding($contents, 'UTF-8', 'SJIS'); // 改行で分割 $lf = explode("\n", $contents); $pre_num = 0; $pre_line = ''; foreach($lf as $lfKey => $lfVal) { // 改行毎のダブルクオート数 $this_num = mb_substr_count($lfVal, '"'); $sum_num = $this_num + $pre_num; if (empty($pre_line)) { $multi_line = $lfVal; } else { // 改行で前行と結合 $multi_line = $pre_line . "\n" . $lfVal; } if ($sum_num % 2 == 0) { // ダブルクオートが偶数 $lines[] = $multi_line; $pre_num = 0; $pre_line = ''; } else { // ダブルクオートが奇数 $pre_num = $sum_num; $pre_line = $multi_line; } } if (! empty($lines)) { foreach($lines as $linesKey => $linesVal) { $linesVal = trim($linesVal); // 空行は除外 if (! empty($linesVal)) { // カンマで分割 $cell = explode(",", $linesVal); $pre_num = 0; $pre_data = ''; foreach($cell as $cellKey => $cellVal) { // カンマ毎のダブルクオート数 $this_num = mb_substr_count($cellVal, '"'); $sum_num = $this_num + $pre_num; if (empty($pre_data)) { $multi_data = $cellVal; } else { // カンマで前セルと結合 $multi_data = $pre_data . "," . $cellVal; } if ($sum_num % 2 == 0) { // ダブルクオートが偶数 // セル前後のダブルクオートを削除 $multi_data = trim($multi_data, '"'); // セル内の""を"へ置換 $data[$linesKey][] = str_replace('""', '"',$multi_data); $pre_num = 0; $pre_data = ''; } else { // ダブルクオートが奇数 $pre_num = $sum_num; $pre_data = $multi_data; } } } } $this->view->assign('data', $data); }

Smarty

<table> {foreach $data as $row} <tr> {foreach $row as $cell} <td>{$cell|escape}</td> {/foreach} </tr> {/foreach} </table>

CSVのセルがカンマ、ダブルクオートが入っている場合、複数行の場合にそれぞれ対応。
例として2行目の3列目がカンマ入り、4列目がダブルクオート入り、5列目が複数行。

CSV

1,2,3,4,5 1,"2","3,4","5""6""7","8 9 0" 1,2,3,4,5

上記CSVをExcelで開いた場合は以下の通り。

Excel

 ABCDE
112345
2123,45"6"78
9
0
312345

$lfの内容
CSVを改行で分割。

Array ( [0] => 1,2,3,4,5 [1] => 1,"2","3,4","5""6""7","8 [2] => 9 [3] => 0" [4] => 1,2,3,4,5 )

$linesの内容
1行あたりのダブルクオートが偶数になるように、前行と改行で結合。

Array ( [0] => 1,2,3,4,5 [1] => 1,"2","3,4","5""6""7","8 9 0" [2] => 1,2,3,4,5 )

$cellの内容
行毎にカンマで分割。

Array ( [0] => 1 [1] => "2" [2] => "3 [3] => 4" [4] => "5""6""7" [5] => "8 9 0" )

$dataの内容
1セルあたりのダブルクオートが偶数になるように、前セルとカンマで結合。不要なダブルクオートを処理。

Array ( [0] => 1 [1] => 2 [2] => 3,4 [3] => 5"6"7 [4] => 8 9 0 )

最新の記事

プロフィール

流されるままにウェブ業界で仕事しています。主にLAPP環境でPHPを書いています。最近はjQueryで遊んでいます。
※動作確認について