read fputs ejemplo php file fgets

php - fputs - fseek() por línea, no bytes?



php fgetcsv (5)

Sé que es tarde para publicar, pero puede ayudar a algunas personas que hice una función como fseekbyline un día ...

function GoToLine($handle,$line) { fseek($handle,0); // seek to 0 $i = 0; $bufcarac = 0; for($i = 1;$i<$line;$i++) { $ligne = fgets($handle); $bufcarac += strlen($ligne); // in the end bufcarac will contains all caracters until the line } fseek($handle,$bufcarac); }

no hay ningún sistema de errores, si quieres ir a la línea <1 o 203 pero el archivo está vacío ... no obtendrás nada bueno.

igual si quieres salir de eot

Tengo un script que analiza los archivos grandes línea por línea. Cuando encuentra un error que no puede manejar, se detiene, notificándonos la última línea analizada.

¿Es esta realmente la mejor / única forma de buscar una línea específica en un archivo? ( fseek() no es utilizable en mi caso).

<?php for ($i = 0; $i < 100000; $i++) fgets($fp); // just discard this

No tengo problemas para usar esto, es lo suficientemente rápido, solo se siente un poco sucio. Por lo que sé sobre el código subyacente, no imagino que haya una mejor manera de hacerlo.


Si entiendo correctamente, desea buscar la línea específica en algún momento después de haber encontrado un error. Si ese es el caso, probablemente almacene o imprima el número de línea de la línea defectuosa en algún lugar, dependiendo de lo que quiere decir con "notificar".

A menos que realmente quiera decir que no puede usar fseek() *, lo que puede hacer es también almacenar / imprimir la posición en el archivo donde comienza la línea defectuosa. Entonces puedes fseek() .

* ¿Cómo, en ese caso, se podría fseekbyline() si existiera?


Si solo tiene el número de línea para continuar, no hay otro método para encontrar la línea. Los archivos no están basados ​​en líneas (ni siquiera en caracteres), por lo que no hay forma de saltar a una línea específica en un archivo.

Puede haber otras formas de leer las líneas en el archivo que pueden ser un poco más rápidas, como leer fragmentos más grandes del archivo en un búfer y leer líneas desde ese punto, pero solo puede esperar que sea un poco más rápido. Cualquier método para encontrar una línea específica en un archivo todavía tiene que leer todos los datos hasta esa línea.


Una forma fácil de buscar una línea específica en un archivo es usar la clase SplFileObject , que permite buscar un número de línea ( seek() ) o un byte offset ( fseek() ).

$file = new SplFileObject(''myfile.txt''); $file->seek(9999); // Seek to line no. 10,000 echo $file->current(); // Print contents of that line

En segundo plano, seek() solo hace lo que hizo su código PHP (excepto en el código C).


rewind($handle); while($i=0; $i<$desired_line; i++) fgetcsv($handle, 1000, ",")

Esto me funciona mientras necesito retroceder a una línea específica varias veces en mi script.

No estoy seguro de si esto consume la memoria o la velocidad, pero funciona.