SplFileObject + LimitIterator + offset

时间:2015-06-19 07:37:50

标签: php offset splfileobject

我有两行数据文件(两行仅用于我的例子,实际上,该文件可以包含数百万行),我使用SplFileObject和LimitIterator进行offseting。但在某些情况下,这种组合有奇怪的行为:

$offset = 0;
$file = new \SplFileObject($filePath);
$fileIterator = new \LimitIterator($file, $offset, 100);
foreach ($fileIterator as $key => $line) {
  echo $key;
}

输出为: 01

但是当 $ offset 设置为 1 时,输出为空(foreach不会迭代任何行)。

我的数据文件包含:

{"generatedAt":1434665322,"numRecords":"1}
{"id":"215255","code":"NB000110"}

我做错了什么?

由于

2 个答案:

答案 0 :(得分:1)

必填:

使用SplFileObject处理来自以下的记录:

  • 给定的开始记录编号
  • 获取给定数量的记录或直至EOF

问题是SplFileObject对文件中的last record感到困惑。这可以防止它在foreach循环中正常工作。

此代码使用SplFileObject和'跳过记录'和'处理记录'。唉,它不能使用foreach循环。

  • 从文件开头($offset)略过一些记录。
  • 处理给定数量的记录或将文件末尾($recordsToProccess
  • 单元化

代码:

<?php

$filePath = __DIR__ . '/Q30932555.txt';
// $filePath = __DIR__ . '/Q30932555_1.txt';

$offset = 1;
$recordsToProcess = 100;

$file = new \SplFileObject($filePath);

// skip the records
$file->seek($offset);

$recordsProcessed = 0;
while (     ($file->valid() || strlen($file->current()) > 0)
         &&  $recordsProcessed < $recordsToProcess
       ) {
    $recordsProcessed++;
    echo '<br />', 'current: ', $file->key(), ' ', $file->current();
    $file->next();
}

答案 1 :(得分:0)

阅读相关的 PHP 错误 65601 建议添加 READ_AHEAD 标志将解决此问题。经过测试并按您的预期工作。

$offset = 0;
$file = new \SplFileObject($filePath);
$file->setFlags(SplFileObject::READ_AHEAD);
$fileIterator = new \LimitIterator($file, $offset, 100);
foreach ($fileIterator as $key => $line) {
  echo $key;
}