SplFileObject + LimitIterator + 偏移量
SplFileObject + LimitIterator + offset
我有两行数据文件(两行仅用于我的示例,实际上,该文件可以包含数百万行)并且我使用 SplFileObject 和 LimitIterator 进行偏移。但是这种组合在某些情况下有奇怪的行为:
$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"}
我做错了什么?
谢谢
必填:
使用 SplFileObject
处理来自以下位置的多条记录:
- 给定的起始记录号
- 对于给定数量的记录或直到
EOF
。
问题是 SplFileObject
对文件中的 last record
感到困惑。这会阻止它在 foreach
循环中正常工作。
此代码使用了SplFileObject
、'skip records'和'processes records'。唉,它不能使用 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();
}
阅读相关的 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;
}
我有两行数据文件(两行仅用于我的示例,实际上,该文件可以包含数百万行)并且我使用 SplFileObject 和 LimitIterator 进行偏移。但是这种组合在某些情况下有奇怪的行为:
$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"}
我做错了什么?
谢谢
必填:
使用 SplFileObject
处理来自以下位置的多条记录:
- 给定的起始记录号
- 对于给定数量的记录或直到
EOF
。
问题是 SplFileObject
对文件中的 last record
感到困惑。这会阻止它在 foreach
循环中正常工作。
此代码使用了SplFileObject
、'skip records'和'processes records'。唉,它不能使用 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();
}
阅读相关的 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;
}