メモ
これまでPHPでCSVを読み書きすることが何度かあったので、
なんとなくライブラリ化して置いといたもののメモです。
fgetcsv(でしたっけ?)は便利ですが、これだけだとその後に配列まわしてガチャガチャしないといけないのがめんどくさいです。
ので、オブジェクトに変換するところと、1レコードずつ処理する場合forとか書かないようにとラップしたものです。
パッケージ
使い方
オブジェクトに変換
- 読み込むCSVの構造をRecordクラスを継承して定義。
- RecordクラスはArrayAccess, JsonSerializableをimplementsしている
<?php
namespace App;
use MyaZaki\Csvert\Record;
class PostalCode extends Record
{
public $delimiter = ',';
public $enclosure = '"';
public $escape = '\\';
public $charset = 'SJIS-win';
public $header = true;
public $columns = [
'Code',
'Street',
'City',
'State',
];
public function getAddress()
{
return $this->attributes['Street'] . ', ' . $this->attributes['City'] . ', ' . $this->attributes['State'];
}
}
- parseするとCollectionのオブジェクトがかえってくる
$parser = PostalCode::parse($filepath);
$records = $parser->get(); // Collection
1レコードずつ逐次処理
- 1レコードに対する処理のcallbackを渡して実行
- CSVデータ全てを格納しないので、メモリ使用量は抑えられる(はず・・)
$parser = PostalCode::parse($filepath);
$address_list = [];
$parser->walk(function ($record) use (&$address_list) {
$address_list[] = $record['Code'] . ' ' . $record->getAddress();
});