[英]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
和“跳過記錄”和“處理記錄”。 唉,它不能使用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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.