PHPでCSVを読み込む

以下のファイルを用意する
test.php

<?php
$result = readCsv("sample.csv");
echo "---------------------------------------------------";
var_dump($result);
echo "---------------------------------------------------";

function readCsv($filePath){
    $csvData = array();
    if(!is_file($filePath)) {
        return $csvData;
    }
    $file = new SplFileObject($filePath);
    $file->setFlags(SplFileObject::READ_CSV | SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY);
    $header = array();
    foreach ($file as $row_num => $row) {
        if($row_num === 0) {
            foreach($row as $col) {
                $header[] = $col;
            }
        }
        $record = array();
        foreach($row as $col_num => $col) {
            $record[$header[$col_num]] = $col;
        }
        $csvData[] = $record;
    }
    return $csvData;
}

sample.csv

date,score,message
2018/01/01,12000,"Good"
2018/01/02,8000,"Nice"
2018/01/03,25000,"Great"

実行結果

行番号とヘッダのカラム名からアクセスできるようにした
var_dumpで出力しているので以下のように表示される

---------------------------------------------------array(4) {
  [0]=>
  array(3) {
    ["date"]=>
    string(4) "date"
    ["score"]=>
    string(5) "score"
    ["message"]=>
    string(7) "message"
  }
  [1]=>
  array(3) {
    ["date"]=>
    string(10) "2018/01/01"
    ["score"]=>
    string(5) "12000"
    ["message"]=>
    string(4) "Good"
  }
  [2]=>
  array(3) {
    ["date"]=>
    string(10) "2018/01/02"
    ["score"]=>
    string(4) "8000"
    ["message"]=>
    string(4) "Nice"
  }
  [3]=>
  array(3) {
    ["date"]=>
    string(10) "2018/01/03"
    ["score"]=>
    string(5) "25000"
    ["message"]=>
    string(9) "Great"
  }
}
---------------------------------------------------

クラス化してヘッダの情報とレコード情報を別々に取り出したり、編集や書き出しができるようにするのもよい

説明

is_file($filePath)

csvファイルの存在チェック

foreach ($file as $row_num => $row)

最初の行はヘッダなのでカラム名を覚えておく
覚えておいたカラム名は各行の値を連想配列に格納する際に使用する

参考

PHP Documentation : is_file
PHP Documentation : SplFileObject

シェアする

  • このエントリーをはてなブックマークに追加

フォローする