fanatique / php-fixed-length-file-parser
PHP 中处理固定长度文本文件的解析器类
dev-master
2014-04-29 10:15 UTC
Requires
- php: >=5.3.0
This package is not auto-updated.
Last update: 2024-09-28 14:01:39 UTC
README
PHP 中处理固定长度文本文件的解析器类。
固定长度文件(也称为穷人版的 CSV)是每行一个数据集的纯文本文件,但没有任何分隔符。
01Amy BLUES
02Bob REDS
...
功能
此类提供了在 PHP 中处理此类文件的一种相当舒适的方式。
你可以
- 注册一个预检查来决定是否需要解析一行
- 注册一个回调来处理每一行
- 注册一个切割映射,将每一行转换为关联数组
用法
以下示例展示了如何将固定长度文件转换为关联数组。示例代码可以在 example/parsing.php
中找到。
$parser = new \Fanatique\Parser\FixedLengthFileParser();
//Set the chopping map (aka where to extract the fields)
$parser->setChoppingMap(array(
array('field_name' => 'id', 'start' => 0, 'length' => 2),
array('field_name' => 'name', 'start' => 2, 'length' => 5),
array('field_name' => 'team', 'start' => 7, 'length' => 5),
));
field_name
和 length
是必需的,而 start
是可选参数。如果省略 start
,则将其设置为上一个映射条目的 start
加上 length
的值。
//Set the absolute path to the file
$parser->setFilePath(__DIR__ . '/example.dat');
//Parse the file
try {
$parser->parse();
} catch (\Fanatique\Parser\ParserException $e) {
echo 'ERROR - ' . $e->getMessage() . PHP_EOL;
exit(1);
}
//Get the content
var_dump($parser->getContent());
注册预检查
可以注册一个预检查在解析之前应用于每一行。闭包需要返回一个布尔值,
false
: 该行不需要解析true
: 解析该行
此示例忽略任何 md5 值为 f23f81318ef24f1ba4df4781d79b7849
的行
$linesToIgnore = array('f23f81318ef24f1ba4df4781d79b7849');
$parser->setPreflightCheck(function($currentLineStr) use($linesToIgnore) {
if (in_array(md5($currentLineStr), $linesToIgnore)) {
//Ignore line
$ret = false;
} else {
//Parse line
$ret = true;
}
return $ret;
}
);
注册回调
最后,您可以注册一个回调,该回调应用于每一行已解析的内容,并允许您对其进行处理。闭包接收一个数组作为已解析的行,并期望返回相同格式的数组。
$parser->setCallback(function(array $currentLine) {
$currentLine['team'] = ucwords(strtolower($currentLine['team']));
return $currentLine;
}
);