我有两行数据文件(两行仅用于我的例子,实际上,该文件可以包含数百万行),我使用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"}
我做错了什么?
由于
答案 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;
}