sebastian / csv-parser
用于类型安全解析CSV文件的库
1.0.1
2024-07-03 04:51 UTC
Requires
- php: >=8.3
This package is auto-updated.
Last update: 2024-09-13 08:59:20 UTC
README
sebastian/csv-parser
用于类型安全解析CSV文件的库。
安装
您可以使用Composer将此库添加到项目中作为本地、针对特定项目的依赖项。
composer require sebastian/csv-parser
如果您仅在开发期间需要此库,例如运行项目测试套件,则应将其添加为开发时依赖项。
composer require --dev sebastian/csv-parser
用法
example.csv
1,2,3,1,0,2023-03-24
<?php declare(strict_types=1); use SebastianBergmann\CsvParser\Parser; use SebastianBergmann\CsvParser\Schema; use SebastianBergmann\CsvParser\FieldDefinition; use SebastianBergmann\CsvParser\Type; use SebastianBergmann\CsvParser\ObjectMapper; $schema = Schema::from( FieldDefinition::from(1, 'a', Type::integer()), FieldDefinition::from(2, 'b', Type::float()), FieldDefinition::from(3, 'c', Type::string()), FieldDefinition::from(4, 'd', Type::boolean()), FieldDefinition::from(5, 'e', Type::boolean()), FieldDefinition::from(6, 'f', Type::object( new class implements ObjectMapper { public function map(string $value): DateTimeImmutable { return new DateTimeImmutable($value); } } )), ); $parser = new Parser; foreach ($parser->parse('example.csv', $schema) as $record) { var_dump($record); }
上面的示例展示了如何使用Schema
对象来配置如何将逗号分隔值的一行字符串解析为数组元素。
1
指的是逗号分隔值行中字符串的位置'a'
指定了为每条记录生成的关联数组中值的键Type::integer()
指定了用于在生成的关联数组中存储值的类型
以下类型可用:
- 布尔值 (
Type::boolean()
; 使用(bool)
类型转换) - 整数 (
Type::integer()
; 使用(int)
类型转换) - 浮点数 (
Type::float()
; 使用(float)
类型转换) - 字符串 (
Type::string()
) - 对象 (
Type::object($mapper)
;$mapper
是实现了SebastianBergmann\CsvParser\ObjectMapper
接口的对象)
Parser::parse()
方法需要两个参数
- 第一个参数,
$filename
,是要解析的CSV文件的路径 - 第二个参数,
$schema
,是我们上面讨论的Schema
对象
运行上面的示例会打印出下面的输出
array(3) {
["a"]=>
int(1)
["b"]=>
float(2)
["c"]=>
string(1) "3"
["d"]=>
bool(true)
["e"]=>
bool(false)
["f"]=>
object(DateTimeImmutable)#1 (3) {
["date"]=>
string(26) "2023-03-24 00:00:00.000000"
["timezone_type"]=>
int(3)
["timezone"]=>
string(13) "Europe/Berlin"
}
}
$parser->ignoreFirstLine()
方法可以用来配置解析器忽略CSV文件的第一行。
$parser->setSeparator()
方法可以用来配置解析器使用与默认逗号不同的分隔符。
$parser->setEnclosure()
方法可以用来配置解析器使用与默认引号不同的封装符。
$parser->setEscape()
方法可以用来配置解析器使用与默认引号不同的转义字符。