PHP

【PHP】CSVファイルの読み込み

More than 3 years have passed since last update.

CSVファイルの読み込み方法はいくつかあるが、PHP5.1以上を使っているならSplFileObject::READ_CSVの一択。fopen+fgetcsvよりスピードが早い。

※SplFileObject::fgetcsvは遅いので注意。

参考:【PHP】その CSV 変換、本当に「fgetcsv」でいいの?


SplFileObject::READ_CSV


csv

foo1,foo2,foo3

bar1,bar2,bar3


php

$file = new SplFileObject($filepath); 

$file->setFlags(SplFileObject::READ_CSV);
foreach ($file as $line) {
//終端の空行を除く処理 空行の場合に取れる値は後述
if(is_null($line[0]){
$records[] = $line;
}
}

var_dump($records);
/*
Array
(
[0]=>Array
(
[0]=>'foo1',
[1]=>'foo2',
[2]=>'foo3',
)
[1]=>Array
(
[0]=>'bar1',
[1]=>'bar2',
[2]=>'bar3',
)
)
*/



空行も読み込む件

読み込み結果を記載する。


  • 改行のみの行

array(1) {

[0] =>
NULL
}


  • 半角スペースのみの行

array(1) {

[0] =>
string(1) " "
}


fopen+fgetcsv

一応こっちも載せておく。

if (($fp = fopen($filepath, "r")) === false) {

//エラー処理
}

// CSVの中身がダブルクオーテーションで囲われていない場合に一文字目が化けるのを回避

setlocale(LC_ALL, 'ja_JP');

$i=0;
while (($line = fgetcsv($fp)) !== FALSE) {
mb_convert_variables('UTF-8', 'sjis-win', $line);
if($i == 0){
// タイトル行
$header = $line;
$i++;
continue;
}

$data[] = $line;

$i++;
}

fclose($fp);

参考:PHP5.2でCSVファイル取り込み