簡體   English   中英

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和“跳過記錄”和“處理記錄”。 唉,它不能使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM