PHP salta líneas mientras lees

Estoy tratando de encontrar una manera rápida de leer un archivo csv, omitiendo varias líneas, leyendo unas 20 líneas y luego deteniendo la lectura. la única solución que ahora está usando es fread, que es bastante ineficiente.

La única forma de desplazarse por un CSV que respeta el formato CSV particular es invocar un analizador. El analizador de CSV más rápido es el integrado en fgetcsv . Por lo tanto, ese va a ser el más rápido de todos los métodos confiables posibles:

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

Usado como:

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

He usado generadores aquí para mantener bajo el consumo de memoria. Puede reemplazarlo fácilmente con una matriz temporal, si lo prefiere.

Si puede hacer algunas suposiciones sobre los finales de línea, entonces puede leer byte a byte hasta que encuentre el rango de terminaciones de línea. Pero, francamente, no haría eso.

Digamos que si tienes este fragmento de código a continuación

 < ?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 ""; // OPEN ROW if(strpos($data[$c], 'Finished') !== false) { $c++; echo "" . $data[$c] . ""; }else{ echo "" . $data[$c] . ""; } echo ""; // CLOSE ROW } } fclose($handle); } ?> 

si agrega

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

después del ciclo while

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

ahora, digamos que si quieres comenzar desde la fila 20, continuaría leyendo

tomemos otro ejemplo. si quiere dejar de leer en la línea 40 comenzando desde 1, puede insertar

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

Intenta usar file() . Leerá todas las líneas de su archivo y luego podrá leerlo de la manera que desee. Por ejemplo:

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