ショコラ
PHP で CSVファイルを読み込むには?
fgetcsv関数を使うのかもしれませんが、そういえば昔そんな処理を作ったかな・・・と。
エクセルでCSV出力したものを読み込む処理です。
もっさん先輩
こちらのリンクを右クリックしてファイルをダウンロードできます。
https://answorz.com/4705/csv.php
csv.php の説明
ポイントは ダブルクォートで囲った値の改行に対応 しているところです。
<?php
function csv(string $file, array $keys = [], string $separator = ',')
{
if (false === ($fp = fopen($file,'r')))
return false;
$row = [];
$val = '';
$in_quotes = false; //クォート内フラグ
$last = ''; //最後の文字
while (false !== ($buf = fgets($fp))) {
$str = str_replace("\r",'',$buf);
$len = mb_strlen($str);
for ($p=0; $p <= $len; $p++) {
$char = mb_substr($str,$p,1);
if (($p == $len) && !$in_quotes) {
$row[] = rtrim($val,"\n");
$val = '';
if ([] !== $keys) {
$row = array_combine($keys,array_pad($row,count($keys),null));
}
yield $row;
$row = [];
}
else if (($separator == $char) && !$in_quotes) {
$row[] = $val;
$val = '';
}
else if ('"' == $char) {
$in_quotes = !$in_quotes;
// 2つのダブルクォートを1つにする処理
if (('"' == $last) && ('"' == $char)) {
$val .= $char;
$char = '';
}
}
else {
$val .= $char;
}
$last = $char;
}
}
fclose($fp);
return true;
}
使い方
foreach (csv('test.csv') as $csv) {
var_dump($csv);
}
以上