rdx/csv-mapper

扩展了 league/csv,增加了映射和异常处理

1.2 2020-05-28 15:10 UTC

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 只更改/删除列。