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
A | B | C | D | E | |
---|---|---|---|---|---|
1 | 1 | 2 | 3 | 4 | 5 |
2 | 1 | 2 | 3,4 | 5"6"7 | 8 9 0 |
3 | 1 | 2 | 3 | 4 | 5 |
$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
)