定制 sassnowski/csv-schema 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

sassnowski/csv-schema

Composer 安装命令:

composer require sassnowski/csv-schema

包简介

Turn your CSV files into objects. It's like an ORM for CSV!

README 文档

README

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

Have you ever wanted to have something like an ORM but for CSV files? No? Well now you can!

Introducing CSV Schema Parser. The number one way to turn your boring old CSV files into kick-ass PHP objects. And as if that wasn't amazing enough, it also casts your data to the correct data type! How cool is that? Not very cool you say? Well I disagree!

Installation

composer require sassnowski/csv-schema

Usage

First we have to define the schema of the CSV file we're about to parse. The schema is an associative array where the keys define what properties will be named on the resulting object. The values specify the data type of that column. The schema is ordered, meaning the first entry in the schema will correspond to the first column in the CSV and so on.

<?php

$config = [
    'schema' => [
        'first_name' => 'string',
        'last_name' => 'string',
        'age' => 'integer',
        'coolness_factor' => 'float',
    ]
];

After we defined the schema, we can instantiate a new parser from it.

<?php

// continuing from above..

$parser = new Sassnowski\CsvSchema\Parser($config);

Reading from a string

The parser provides a fromString method that will turn any CSV string into an array of objects. The objects will be structured according to our schema.

<?php

public Parser::fromString(string $input): array

Example

<?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)

Reading from a file

More often than not you will parse your CSV from a file. For this the Parser provides the fromFile method.

<?php

public Parser::fromFile(string $filename): array

Example

<?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)

Configuration

The configuration array provides a way to overwrite the default settings of the parser. You can set the delimiter, the enclosure character, the escape character and the encoding of the input file.

<?php

$config = [
    'delimiter' => ',',
    'enclosure' => '"',
    'escape' => '\\',
    'skipTitle' => false,
    'encoding' => 'UTF-8',
    'schema' => [ /* Your schema */ ],
];

Available Column Types

You can parse a column to string, float, integer and array.

Parsing arrays

Assuming you have multiple values in a column (sometimes we cannot choose our data...) you might want to parse that column into an array instead. You can do this by specifying array:<delimiter> as the column type in your schema.

<?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"
// }

Adding custom types

Sometimes you might want a bit more control than the built-in types give you. For instance, you might want to query your database based on an integer in one of your columns and return a model instead. You can easily register arbitrarily complex types by using the static registerType method on the Parser class.

<?php

public static registerType(string $type, callable $callback)

The provided callback receives the column's value and should return its parsed representation.

<?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"

Adding parameters to custom types

You can add additional parameters to your types by specifying them in the following format in your schema <type>:<parameter>. In this case, the callback function gets passed a second parameter containing the parameter specified in the schema. This allows you to reuse your types instead of defining all sorts of variations of the same type (like querying the database, but using a different table/model).

<?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)
//    ...
// }

sassnowski/csv-schema 适用场景与选型建议

sassnowski/csv-schema 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 5.41k 次下载、GitHub Stars 达 25, 最近一次更新时间为 2016 年 08 月 23 日, 在 PHP 生态内属于活跃度较高的组件。

我们在过去多个企业项目中使用过 sassnowski/csv-schema 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 sassnowski/csv-schema 我们能提供哪些服务?
定制开发 / 二次开发

基于 sassnowski/csv-schema 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 5.41k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 25
  • 点击次数: 13
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 25
  • Watchers: 1
  • Forks: 3
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2016-08-23