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

  • 74
    いいね
  • 3
    コメント
この記事は最終更新日から1年以上が経過しています。

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ファイル取り込み