tii / csv-state-parser
使用简单的有限状态机解析 CSV 文件。
Requires
- php: ^8.2
Requires (Dev)
- laravel/pint: ^1.17
- mockery/mockery: ^1.6
- pestphp/pest: ^2.35
- spatie/ray: ^1.41
This package is auto-updated.
Last update: 2024-09-08 10:59:18 UTC
README
CSV 状态解析器
使用简单的有限状态机解析 CSV 文件。
安装
安装简单。
只需运行 composer require tii/csv-state-parser
(回到顶部)
用法
创建一个扩展 \Tii\CsvStateParser\CsvStateParser
的解析器类,并实现 stateStart
和 result
方法。下面是完整示例。
每一行都会传递到当前的活动状态方法(开始时为 stateStart
)。
您可以通过调用 $this->state($nextState)
并传递一个字符串枚举或可以转换为字符串的值来从下一行开始更改状态。下一行将传递到相应的状态方法。例如,如果您调用 $this->state('fooBar')
,则下一行将传递到 stateFooBar(array $row)
。
如果您需要在转换 CSV 文件中的每个字段之前,您可以重写 protected function mapValue(string $value): string
方法。这对于编码转换非常有用。
有一些额外的辅助工具可以帮助您完成工作
您负责自行编译解析器在结束时应返回的数据。此数据应通过 result()
方法返回。
下面是完整示例
/** * @extends \Tii\CsvStateParser\CsvStateParser<array<int, int>> */ class SumParser extends \Tii\CsvStateParser\CsvStateParser { protected array $sums = []; protected function result(): array { return $this->sums; } protected function stateStart(array $row): void { if ($row[0] === 'START') { $this->state('list'); } } protected function stateList(array $row): void { if ($row[0] === 'END') { $this->done(); return; } $this->items[] = array_reduce($row, fn($sum, $number) => $sum + $number, 0); } }
您可以通过实例化它并调用 parse(string $filename)
方法来使用您的解析器。
如果您需要调整分隔符、封装符和转义字符,可以将这些传递给构造函数。
⚠️ 注意! 与 PHP 的 fgetcsv 函数不同,此包使用 ';' 作为 CSV 文件的默认分隔符字符。
$parser = new SumParser(separator: ','); $list = $parser->parse('filename.csv');
(回到顶部)
贡献
贡献是开源社区如此美妙的地方的原因,可以学习、灵感和创造。您做出的任何贡献都 非常感谢。
如果您有改进此项目的建议,请将仓库分支出来并创建一个拉取请求。您也可以简单地打开一个带有“增强”标签的问题。别忘了给项目加星!再次感谢!
- 分支项目
- 创建您的功能分支(
git checkout -b feature/AmazingFeature
) - 提交您的更改(
git commit -m 'Add some AmazingFeature'
) - 推送到分支(
git push origin feature/AmazingFeature
) - 打开拉取请求
(回到顶部)
主要贡献者
许可
在 MIT 许可下分发。有关更多信息,请参阅 LICENSE
。
(回到顶部)
联系
Tii - @Tii - mail@tii.one
项目链接:https://github.com/TiiFuchs/csv-state-parser
(回到顶部)