fabiomez/data-extractor

用于从字符串或文件中的CSV行等常见资源中提取数据的库

1.0.0 2021-03-25 16:43 UTC

This package is auto-updated.

Last update: 2024-09-26 01:20:24 UTC


README

为什么

每次我需要解析CNAB、EDI或任何CSV文件这样的文件时,这个过程都变得非常相似,并且总是返回一个数组,我无法相信它们会返回什么样的索引。有时由于某些数据没有返回而破坏应用程序。因此,我决定编写这个库,该库使用模型对象来处理提取的数据。数据提取的方式将记录在模型的属性docblock中,这将保证开发者在模型的属性上获得自动完成,并提供关于提取方式以及可选的,数据的含义的适当描述。这是我真正缺少的数组。

安装

执行 composer require fabiomez/data-extractor

或者将 fabiomez/data-extractor: "*" 添加到 composer.json 文件中的 required 部分。

用法

数据提取器在模型属性之上工作。模型可以是任何具有带有 @stractable 标签的公共属性的类。

在版本1中,数据提取器提供了3种数据获取器类型,分别是:子串、数组和正则表达式。

每种类型的值获取器都需要其自己的docblok标签,这些标签必须是 @extractable 标签的子标签。

子串

子串值获取器的工作方式类似于PHP函数中的 substr,其中:

  • {@start} 是基于0索引的起始位置。
  • {@length} 是所需文本的长度。
/**
 * @extractable
 *   {@start integer}
 *   {@length integer}
 */

数组

索引是一个简单的数组索引,必须从CSV文件中提取(例如)。可以是数字索引或关联索引。

/**
 * @extractable
 *   {@index mixed}
 */

正则表达式

正则表达式使用模式来匹配所需数据,其中:

  • {@pattern} 必须是任何有效的模式,必须匹配所需数据。
  • {@index} 是从模式中匹配数据的数字索引。
/**
 * @extractable
 *   {@pattern string}
 *   {@index integer}
 */

模型

编写一个带有docblock描述的公共属性类,以引导提取器

class MyModel
{
    /**
     * @extractable
     *    {@start 0}
     *    {@length 10}
     * @otherTag from prop 1
     */
    public $prop1;

    /**
     * @extractable
     *    {@start 10}
     *    {@length 11}
     * @otherTag from prop 2
     */
    public $prop2;
}

获取提取器

提取器可以直接实例化或通过工厂创建

直接

use Fabiomez\DataExtractor\Extractor;
use Fabiomez\DataExtractor\DocBlockParser;
use Fabiomez\DataExtractor\ValueGetters\ArrayValueGetter;
use Fabiomez\DataExtractor\ValueGetters\RegexValueGetter;
use Fabiomez\DataExtractor\ValueGetters\SubstringValueGetter;

//Array extractor
$extractor = new Extractor(
    DocBlockParser::createInstance(),
    new ArrayValueGetter()
);

//Regex extractor
$extractor = new Extractor(
    DocBlockParser::createInstance(),
    new RegexValueGetter()
);

//Substring extractor
$extractor = new Extractor(
    DocBlockParser::createInstance(),
    new SubstringValueGetter()
);

通过工厂

use Fabiomez\DataExtractor\ExtractorFactory;

$factory = new ExtractorFactory();

//Array extractor
$extractor = $factory->createArrayExtractor();

//Regex extractor
$extractor = $factory->createRegexExtractor();

//Substring extractor
$extractor = $factory->createSubstringExtractor();

从源中提取数据

提取过程可以使用模型命名空间或实例;

//By namespace
$extractedModel = $extractor->extract(MyModel::class, 'First dataSecond Data');

//By instance
$extractedModel = $extractor->extract(new MyModel(), 'First dataSecond Data');

echo $extractedModel->prop1; //will give 'First data'
echo $extractedModel->prop2; //will give 'Second data'

可选地,可以在第三个参数上提供一个回调,在提取后触摸模型

$extractedModel = $extractor->extract(
    MyModel::class,
    'First dataSecond Data',
    function ($model, $propertiesSchema) {
        foreach ($propertiesSchema as $property => $schema) {
            $model->{$property} .= $schema['otherTag'];
        }
    }
);

echo $extractedModel->prop1; //will give 'First data from prop 1'
echo $extractedModel->prop2; //will give 'Second data from prop 2'