sassnowski / csv-schema
将您的CSV文件转换为对象。它就像CSV的ORM!
Requires
- league/csv: ^8.0
- tightenco/collect: ^5.2
Requires (Dev)
- phpspec/phpspec: ~2.0
This package is auto-updated.
Last update: 2024-08-29 03:52:54 UTC
README
您是否曾想过拥有类似ORM的东西,但用于CSV文件?没有?现在您可以做得到!
介绍 CSV Schema 解析器。将您枯燥的旧CSV文件转换为超级PHP对象的最佳方式。而且更神奇的是,它还会将数据转换为正确的数据类型!酷吗?您说不太酷?嗯,我不同意!
安装
composer require sassnowski/csv-schema
用法
首先,我们需要定义我们要解析的CSV文件的架构。架构是一个关联数组,键定义了结果对象上将命名的属性。值指定了该列的数据类型。架构是有序的,这意味着架构中的第一个条目将对应CSV中的第一列,依此类推。
<?php $config = [ 'schema' => [ 'first_name' => 'string', 'last_name' => 'string', 'age' => 'integer', 'coolness_factor' => 'float', ] ];
定义架构后,我们可以从中实例化一个新的解析器。
<?php // continuing from above.. $parser = new Sassnowski\CsvSchema\Parser($config);
从字符串读取
解析器提供了一个 fromString
方法,可以将任何CSV字符串转换为对象的数组。对象将根据我们的架构进行结构化。
<?php public Parser::fromString(string $input): array
示例
<?php // Using our parser from above.. $input = "Kai,Sassnowski,26,0.3\nJohn,Doe,38,7.8"; $rows = $parser->fromString($input); var_dump($rows[0]->firstname); // string(3) "Kai" var_dump($rows[0]->age); // int(26) var_dump($rows[0]->coolness_factor); // float(0.3)
从文件读取
通常情况下,您会从文件中解析CSV。为此,Parser
提供了fromFile
方法。
<?php public Parser::fromFile(string $filename): array
示例
<?php // Using our parser from above.. // Assuming our file contains the same data as the string example. $rows = $parser->fromFile('somefile.csv'); var_dump($rows[1]->firstname); // string(4) "John" var_dump($rows[1]->coolness_factor); // float(7.8)
配置
配置数组提供了一种方法来覆盖解析器的默认设置。您可以设置输入文件的分隔符
、封装
字符、转义
字符和编码
。
<?php $config = [ 'delimiter' => ',', 'enclosure' => '"', 'escape' => '\\', 'skipTitle' => false, 'encoding' => 'UTF-8', 'schema' => [ /* Your schema */ ], ];
可用的列类型
您可以将列解析为string
、float
、integer
和array
。
解析数组
假设您在一个列中有多个值(有时我们无法选择我们的数据...),您可能希望将此列解析为数组。您可以通过在架构中将列类型指定为array:
来实现。
<?php $config = [ 'schema' => [ 'name' => 'string', 'friends' => 'array:|' ], ]; $input = 'Kai Sassnowski,Lots|and|lots|of|friends'; $parser = new Sassnowski\CsvSchema\Parser($config); $rows = $parser->fromString($input); var_dump($rows[0])->friends); // array(5) { // [0]=> // string(4) "Lots" // [1]=> // string(3) "and" // [2]=> // string(4) "lots" // [3]=> // string(2) "of" // [4]=> // string(7) "friends" // }
添加自定义类型
有时您可能比内置类型提供更多的控制。例如,您可能希望根据您某列中的整数查询数据库并返回一个模型。您可以通过在Parser
类上使用静态registerType
方法轻松地注册任意复杂的类型。
<?php public static registerType(string $type, callable $callback)
提供的回调函数接收列的值并应返回其解析表示形式。
<?php Parser::registerType('foo', function ($value) { return $value.'foo'; }); $config = [ 'schema' => [ 'custom' => 'foo' ] ]; $parser = new \Sassnowski\CsvSchema\Parser($config); $rows = $parser->fromString("hello\nworld"); var_dump($rows[0]->custom); // string(8) "hellofoo" var_dump($rows[1]->custom); // string(8) "worldfoo"
为自定义类型添加参数
您可以通过在架构中指定以下格式来向您的类型添加额外的参数:<type>:<parameter>
。在这种情况下,回调函数将获得一个包含在架构中指定的参数的第二个参数。这允许您重用您的类型,而不是定义所有各种类型的变体(如查询数据库,但使用不同的表/模型)。
<?php Parser::registerType('model', function ($value, $table) { // Pseudo code, assuming some library. return DB::table($table)->findById($value); }); $config = [ 'schema' => [ 'author' => 'model:authors', 'uploaded_by' => 'model:users', ] ]; $input = "5,13"; $parser = new \Sassnowski\CsvSchema\Parser($config); $rows = $parser->fromString($input); var_dump($rows[0]->author); // object(Author)#1 (15) { // ["id"]=> // int(5) // ... // } var_dump($rows[1]->uploaded_by); // object(User)#1 (12) { // ["id"]=> // int(13) // ... // }