2016-07-20 7 views
2

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

+3

Почему бы не попробовать фуд? это то, что 'fgetcsv()' будет использовать внутренне в любом случае. так или иначе, эти строки должны быть прочитаны в php, чтобы понять, где разрыв строки. если вы решите пропустить/проигнорировать эти строки, это не проблема php - данные должны быть прочитаны. –

+0

Вы можете прочитать весь файл в массив с 'file()', а затем использовать 'array_slice()', чтобы получить нужные строки. – Barmar

+0

Но если файл большой, это будет медленнее и расточительно. Ваш первоначальный путь, вероятно, лучший. – Barmar

ответ

1

Единственный способ прокрутки через 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); 

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

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

+0

спасибо, ребята, особенно @bishop – Karuhanga

0

Попробуйте использовать 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 
    } 

} 
1

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

<?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 (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
     if($row == 20){ $row++; continue; } 

сейчас, скажем, если вы хотите начать с строки 20, это будет c ontinue чтение

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

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

@ref: http://stackoverflow.com/questions/10901113/skip-the-first-line-of-a-csv-file – unixmiah

Смежные вопросы