fabiomez / data-extractor
用于从字符串或文件中的CSV行等常见资源中提取数据的库
1.0.0
2021-03-25 16:43 UTC
Requires
Requires (Dev)
- phpunit/phpunit: ^9.4@dev
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'