用PHP读写CSV文件
记事
由于过去几次使用PHP来读写CSV文件,我不知怎么地将其封装成了一个库,并保存了下来。
fgetcsv非常方便,但是仅仅使用它会变得麻烦,因为之后需要遍历数组进行处理。
因此,我将其封装成对象,使得可以一次转换并逐条处理记录的情况下避免编写for循环。
包装
米亚-扎基/ CSVERT
用法
将对象转换
-
- 読み込む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レコードに対する処理のcallbackを渡して実行
CSVデータ全てを格納しないので、メモリ使用量は抑えられる(はず・・)
$parser = PostalCode::parse($filepath);
$address_list = [];
$parser->walk(function ($record) use (&$address_list) {
$address_list[] = $record['Code'] . ' ' . $record->getAddress();
});