2015-06-19 4 views
2

У меня есть файл данных с двумя строками (две строки только для моего примера, в реале, этот файл может содержать миллионы строк), и я использую SplFileObject и LimitIterator с офсетным. Но эта комбинация имеет странное поведение в некоторых случаях:SplFileObject + LimitIterator + offset

$offset = 0; 
$file = new \SplFileObject($filePath); 
$fileIterator = new \LimitIterator($file, $offset, 100); 
foreach ($fileIterator as $key => $line) { 
    echo $key; 
} 

Выхода:

Но с $ компенсированы набор для , выход пустой (Еогеасп не перебирать все строки).

Мой файл данных содержит следующее:

{"generatedAt":1434665322,"numRecords":"1} 
{"id":"215255","code":"NB000110"} 

Что я делаю неправильно?

Благодаря

+0

Я не знаю, если это важно или нет, но есть недостающий ' «' в конце первого ligne вашего файла данных. – Blackus

+0

Это просто опечатка, когда я сформировал его как код. –

+0

Итак, это может быть помечено как ошибка PHP или хотя бы неправильное поведение? Я правильно понял это? –

ответ

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(); 
} 
+0

Это немного« неуклюжий », но, похоже, он делает это. –

+0

Конечно, это решило мою проблему. Но я очень хочу использовать LimitIterator, потому что у него есть гораздо более читаемый код :( –

+0

@ MiroslavHruška, я попробовал! Увы, я не мог получить ничего разумного при использовании «LimitIterator». –