mhitza/file-enumerators

此包已弃用且不再维护。未建议替代包。

文件流和预处理库(通过生成器)

1.3.0 2015-09-24 21:33 UTC

This package is auto-updated.

Last update: 2020-08-22 07:02:32 UTC


README

Build Status Code Climate Test Coverage SensioLabsInsight

文件流库(通过生成器),适用于逐行读取器和CSV解析(可能在某些时候出现其他特殊化)。

重要的一点是要记住,生成器是单向迭代器。因此,你应该注意在示例代码中,我是将 enumerate() 调用放在 foreach 构造中,而不是将其分配给变量,然后遍历该变量。这是迭代生成器的安全方式,因为 enumerate()Generator 构造器,除非你想要限制对流的单次遍历,在这种情况下,将生成器绑定到变量是首选的。

安装

作为 composer 包 提供,要求 PHP >=5.5.0

$ composer.phar require mhitza/file-enumerators

示例用法

逐行读取器

a.k.a. 如何将经典的 fgets 函数使用在这个库中

<?php

use FileEnumerators\Reader\Line as LineReader;

$enumerator = new FileEnumerators\Enumerator('testfile.txt', new LineReader);

foreach($enumerator->enumerate() as $line) {
  echo $line;
}

CSV 读取器 - 简单

<?php

use FileEnumerators\Reader\CSV as CSVReader;

$enumerator = new FileEnumerators\Enumerator('datafile.csv', new CSVReader);

foreach($enumerator->enumerate() as $row) {
  echo "ROW\n";
  foreach($row as $column) {
    echo "\t$column";
  }
}

CSV 读取器 - 更复杂

考虑一个有5列的CSV文件,但我们只对第 列感兴趣。我们还希望这些列有语义上合适的键,而不是数字。也许我们的第 列包含由破折号分隔的一组数字,我们想要将它们相加。

<?php

use FileEnumerators\Reader\CSV as CSVReader;
use FileEnumerators\Reader\Transformer\CSV as CSVTransformer;

$transformer = new CSVTransformer();
$transformer->onlyColumns(0,2,4)
            ->columnsToNames([
              0 => "title",
              2 => "something-relevant",
              4 => "user-ratings"
            ])
            ->mapColumn(4, function($value){
              return array_sum(array_map('intval', str_split('-', $value)));
            });
  
$reader = new CSVReader(
  CSVReader::COMMA_DELIMITED,
  $transformer
);

$enumerator = new FileEnumerators\Enumerator('datafile.csv', $reader);

foreach($enumerator->enumerate() as $row) {
  printf("%s %s %d",
    $row['title'],
    $row['something-relevant'],
    $row['user-ratings']
  );
}

或者更喜欢的变体,将所有内容捆绑在一个单一的构建器集中。

<?php

use FileEnumerators\Reader\CSV as CSVReader;
use FileEnumerators\Reader\Transformer\CSV as CSVTransformer;

$enumerator = new FileEnumerators\Enumerator(
  'datafile.csv',
  new CSVReader(
    CSVReader::COMMA_DELIMITED,
    (new CSVTransformer)
      ->onlyColumns(0,2,4)
      ->columnsToNames([
        0 => "Title",
        2 => "Something relevant",
        4 => "User ratings"
      ])
      ->mapColumn(4, function($value){
        return array_sum(array_map(str_split('-', $value), 'intval'));
      })
  )
);

foreach($enumerator->enumerate() as $row) {
  printf("%s %s %d",
    $row['title'],
    $row['something-relevant'],
    $row['user-ratings']
  );
}

目录列表

围绕 DirectoryIterator 的小包装,用于列出给定目录中的文件(忽略目录和点文件)

<?php

use FileEnumerators\Reader\Directory as DirectoryReader;

$enumerator = new FileEnumerators\Enumerator(new DirectoryReader('.'));

# @var $file \DirectoryIterator
foreach($enumerator->enumerate() as $file) {
  echo $file->getFilename();
}