[ PHP ] csv ファイルを読み込む ( fgetcsv / SplFileObject )

Pocket

PHP では CSV ファイルを読み込み関数が用意されていますので、容易に CSV ファイルを読み込むことができます。ここでは、fgetcsv 関数を使用する方法と SplFileObject クラスを使用した2種類の方法で読み込むサンプルコードを掲載しています。

スポンサーリンク

サンプルデータ

ここで掲載するサンプルコードでは以下の csv ファイルを読み込むことにします。

"データ11", "データ12", "データ13", "データ14"

"データ21", "データ22", 
"データ31", "データ32", "データ33", "データ34", "データ35" ← 改行なし
fgetcsv 関数を使用する
$row = 1;
if (($handle = fopen("/path/to/data.csv", "r")) !== false) {
    while (($data = fgetcsv($handle, 1000, ",")) !== false) {

        // 1行当たりのデータ数を取得
        $num = count($data);

        // 取得データを出力
        echo "$num fields in line $row: ";
        $row++;
        for ($c=0; $c < $num; $c++) {
            echo $data[$c] . (($num - 1 === $c) ? "" : ", ");
        }
        echo "\n";
    }
    fclose($handle);
}

// 出力結果
//---------------------------------------------------------------
// 4 fields in line 1:
// データ11, データ12, データ13, データ14
//
// 1 fields in line 2:
//
// 3 fields in line 3:
// データ21, データ22,
//
// 5 fields in line 4:
// データ31, データ32, データ33, データ34, データ35
SplFileObject クラスを使用する
$row = 1;
$file = new SplFileObject("/path/to/data.csv");
$file->setFlags(SplFileObject::READ_CSV);
/*
 * 以下のように SplFileObject::SKIP_EMPTY フラグも設定しても
 * 空行はスキップしてくれない
 */
// $file->setFlags(SplFileObject::READ_CSV | SplFileObject::SKIP_EMPTY);

foreach ($file as $data) {
    
    // 1行当たりのデータ数を取得
    $num = count($data);
        
    // 取得データを出力
    echo "$num fields in line $row: ";
    $row++;
    for ($c=0; $c < $num; $c++) {
        echo $data[$c] . (($num - 1 === $c) ? "" : ", ");
    }
    echo "\n";
}

// 出力結果
//---------------------------------------------------------------
// 4 fields in line 1:
// データ11, データ12, データ13, データ14
//
// 1 fields in line 2:
//
// 3 fields in line 3:
// データ21, データ22,
//
// 5 fields in line 4:
// データ31, データ32, データ33, データ34, データ35
ポイント

ここで使用したサンプルデータの最終行には改行が入っていないものを使用しました。最終行に改行が入っているデータを SplFileObject クラスを使用して読み込んだ場合、 EOF のみの最終行も読み込まれてしまうので全部で 5行として扱われます。fgetcsv 関数を使用した場合は csv データの最終行に改行があった場合でも 4行として扱われます。

参考

 

スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *