sebastian/csv-parser

用于类型安全解析CSV文件的库

1.0.1 2024-07-03 04:51 UTC

This package is auto-updated.

Last update: 2024-09-13 08:59:20 UTC


README

Latest Stable Version CI Status codecov

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() 方法可以用来配置解析器使用与默认引号不同的转义字符。