5

私は2行のデータファイルを持っており(私の例のためだけに2行、実際には、そのファイルには数百万行を含めることができます)、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"}

私が間違っていることは何ですか?

ありがとう

4

2 に答える 2

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();
}
于 2015-06-19T10:38:48.023 に答える