rdx / csv-mapper
扩展了 league/csv,增加了映射和异常处理
1.2
2020-05-28 15:10 UTC
Requires
- league/csv: ^9.1
This package is auto-updated.
Last update: 2024-08-29 01:05:59 UTC
README
使用 league\csv
读取 CSV。添加记录与列映射。
第一行始终用作标题。您不需要调用 setHeaderOffset(0)
。
在所有示例中,$reader
是迭代,而不是用 Statement
查询
foreach ( $reader as $record ) {
// $record is done, no more processing needed
print_r($record);
}
记录映射器
要仅保留某些列并丢弃其余部分,请使用 KeepColumnsMapper
$reader = \rdx\csvmapper\Reader::createFromPath($file);
$reader->addMapper(new KeepColumnsMapper(['firstname', 'lastname', 'email']));
通过实现 RecordMapper
创建自己的记录映射器
class AddTimestampMapper implements RecordMapper {
protected $time;
public function __construct( $time ) {
$this->time = $time;
}
public function map( array $record, $index ) {
$record['timestamp'] = $this->time;
return $record;
}
}
$reader->addMapper(new AddTimestampMapper(time()));
要求列
在处理迭代行之前要求列
$reader = \rdx\csvmapper\Reader::createFromPath($file);
try {
$reader->requireColumns(['email']);
}
catch ( MissingColumnsException $ex ) {
echo implode(', ', $ex->getColumns());
}
列映射器
如果同一行的多个列具有相同的映射,请使用具有 ColumnMapper
接口的 ColumnsMapper
记录映射器。
使用您自己的日期格式化程序格式化多个日期字段
class DateFormatMapper implements ColumnMapper {
public function map( array $record, $column, $index, $unset ) {
$value = trim($record[$column]);
$date = my_custom_date_maker($value);
if ( !$date ) {
// Invalid = NIL
return null;
// Invalid = skip field (remove from $record)
return $unset;
// Invalid = user error
throw new LineException($index, "Invalid date: '$value'");
}
return $date;
}
}
try {
$reader = \rdx\csvmapper\Reader::createFromPath($file);
$reader->addMapper(new ColumnsMapper(new DateFormatMapper(), ['birthdate', 'created_on', 'valid_until']));
}
catch ( LineException $ex ) {
echo $ex->getMessage();
print_r($ex->getRecord($reader));
}
这将针对每行运行 DateFormatMapper
最多 3 次。映射器仅对存在于 $record
中的字段运行。
如果您想从一个字段创建一个字段,请使用 RecordMapper
来更改记录。ColumnMapper
只更改/删除列。