cego/php-fixed-length-file-parser

PHP中处理固定长度文本文件的解析类

2.0.0 2021-03-30 05:03 UTC

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_namelength 是必需的,而 start 是可选参数。如果省略 start,它将设置为上一个映射条目的 startlength 值。

//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;
        }
);