2016-07-20 14 views
2

Ich versuche, eine schnelle Möglichkeit zum Lesen von einer CSV-Datei zu finden, indem Sie zuerst eine Reihe von Zeilen überspringen, lesen etwa 20 Zeilen, dann das Lesen zu stoppen. Die einzige Lösung, die es jetzt gibt, ist fread, was ziemlich ineffizient ist.PHP-Zeilen überspringen beim Lesen

+3

warum vermeiden fread? das wird 'fgetcsv()' intern sowieso verwenden. Auf die eine oder andere Weise müssen diese Zeilen in PHP gelesen werden, damit sie herausfinden können, wo die Zeilenumbrüche liegen. Wenn Sie diese Zeilen überspringen/ignorieren, ist das nicht das Problem von PHP - die Daten müssen gelesen werden. –

+0

Sie könnten die ganze Datei in ein Array mit 'file()' lesen und dann 'array_slice()' verwenden, um die gewünschten Zeilen zu erhalten. – Barmar

+0

Aber wenn die Datei groß ist, wird das langsamer und verschwenderisch. Dein ursprünglicher Weg ist wahrscheinlich der beste. – Barmar

Antwort

1

Der einzige Weg, fügen über eine CSV blättern, die der jeweilige CSV-Format respektiert ist, einen Parser zu berufen. Der schnellste CSV-Parser ist der eingebaute fgetcsv. So geht das am schnellsten von allen möglichen zuverlässigen Methoden, um:

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; 
    } 
} 

gebraucht wie:

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

Ich habe hier verwendete Generatoren den Speicherverbrauch niedrig zu halten. Sie können leicht mit einem temporären Array ersetzen, wenn Sie bevorzugen.

Wenn Sie einige Annahmen über Zeilenenden machen können, dann können Sie Byte für Byte lesen, bis Sie den Bereich der Zeilenenden gefunden haben. Aber ehrlich gesagt würde ich das nicht tun.

+0

danke Jungs, vor allem @Bischof – Karuhanga

0

Versuchen Sie mit file(). Es liest alle Zeilen Ihrer Datei und Sie können es so lesen, wie Sie möchten. Zum Beispiel:

$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

Lassen Sie uns sagen, wenn Sie dieses Stück Code haben unter

<?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); 
    } 
?> 

wenn Sie

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

nach der while-Schleife

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

jetzt hinzufügen, Lassen Sie uns sagen, wenn Sie von Zeile 20 beginnen möchten, würde es c ontinue lesen

nehmen wir ein anderes Beispiel. wenn Sie in Zeile 40 ab dem 1. Lesen stoppen möchten, können Sie

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

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

Verwandte Themen