cego / php-fixed-length-file-parser
PHP中处理固定长度文本文件的解析类
2.0.0
2021-03-30 05:03 UTC
Requires
- php: >=5.3.0
- ext-iconv: *
- ext-mbstring: *
This package is not auto-updated.
Last update: 2024-09-25 20:51:41 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;
}
);