sassnowski/csv-schema

将您的CSV文件转换为对象。它就像CSV的ORM!

0.4.1 2017-07-20 21:28 UTC

This package is auto-updated.

Last update: 2024-08-29 03:52:54 UTC


README

Build Status Code Climate Scrutinizer Code Quality SensioLabsInsight GitHub license Current Release

您是否曾想过拥有类似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 */ ],
];

可用的列类型

您可以将列解析为stringfloatintegerarray

解析数组

假设您在一个列中有多个值(有时我们无法选择我们的数据...),您可能希望将此列解析为数组。您可以通过在架构中将列类型指定为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)
//    ...
// }