mhitza / file-enumerators
此包已弃用且不再维护。未建议替代包。
文件流和预处理库(通过生成器)
1.3.0
2015-09-24 21:33 UTC
Requires
- php: >=5.5.0
Requires (Dev)
- codeclimate/php-test-reporter: dev-master
- phpunit/phpunit: ~4.4.0
README
文件流库(通过生成器),适用于逐行读取器和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(); }