Я пытаюсь найти быстрый способ чтения из файла 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 } }