Intereting Posts

PHP пропускает строки при чтении

Я пытаюсь найти быстрый способ чтения из файла csv, сначала пропустив несколько строк, прочитав около 20 строк, а затем остановив чтение. единственное решение ryt теперь использует fread, что довольно неэффективно.

Единственный способ прокрутки CSV, который соответствует конкретному CSV-формату, – это вызвать парсер. Самый быстрый CSV-парсер – встроенный fgetcsv . Таким образом, это будет самый быстрый из всех возможных надежных методов:

 function csv_slice($fp, $offset = 0, $length = 0) { $i = 0; while (false !== ($row = fgetcsv($fp))) { if ($i++ < $offset) continue; if (0 < $length && $length <= ($i - $offset - 1)) break; yield $row; } } 

Используется как:

 $fp = fopen('file.csv', 'r'); print_r( iterator_to_array( csv_slice($fp, 5, 2) // start after 5th row, return 2 rows ) ); fclose($fp); 

Я использовал генераторы здесь, чтобы снизить потребление памяти. Вы можете легко заменить временным массивом, если хотите.

Если вы можете сделать некоторые предположения о концах строк, вы можете просто читать байты по-байтам, пока не найдете диапазон окончаний строк. Но, честно говоря, я бы этого не сделал.

Допустим, если у вас есть этот код ниже

 <?php $row = 1; if (($handle = fopen("ptt.csv", "r")) !== FALSE) { while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { $num = count($data); $row++; for ($c=0; $c < $num; $c++) { echo "<TR>"; // OPEN ROW if(strpos($data[$c], 'Finished') !== false) { $c++; echo "<TD nowrap>" . $data[$c] . "</TD>"; }else{ echo "<TD nowrap>" . $data[$c] . "</TD>"; } echo "</TR>"; // CLOSE ROW } } fclose($handle); } ?> 

если вы добавите

  if($row == 20){ $row++; continue; } 

после цикла while

  while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { if($row == 20){ $row++; continue; } 

теперь, скажем, если вы хотите начать с строки 20, она продолжит чтение

давайте возьмем еще один пример. если вы хотите прекратить чтение по строке 40, начиная с 1, вы можете вставить

  if($row == 40){ $row++; exit; } 

Попробуйте использовать file() . Он будет читать все строки вашего файла, а затем вы можете прочитать его так, как хотите. Например:

 $lines = file("myfile.txt"); $lineCounter = count($lines); if($lineCounter > 20){ $startsAt = 21; //Skip 20 lines for($i = $startsAt; $i < $lineCounter; $i++){ $line = $lines[$i]; //Do whatever you want with the line contents } }