2012-02-21 28 views
5

Estoy trabajando en la lectura de un archivo en php. Necesito leer líneas específicas del archivo.Leyendo línea específica de un archivo en PHP

que utiliza este código:

fseek($file_handle,$start); 
while (!feof($file_handle)) 
{ 
    ///Get and read the line of the file pointed at. 
    $line = fgets($file_handle); 
    $lineArray .= $line."LINE_SEPARATOR"; 

    processLine($lineArray, $linecount, $logger, $xmlReply); 

    $counter++; 
} 
fclose($file_handle); 

Sin embargo, me di cuenta de que el fseek() toma el número de bytes y no el número de línea.

¿Tiene PHP otra función que basa su puntero en números de línea?

¿O tengo que leer el archivo desde el principio siempre, y tener un contador hasta que se lea el número de línea deseado?

Estoy buscando un algoritmo eficiente, caminar más de 500-1000 Kb para llegar a la línea deseada parece ineficiente.

Respuesta

11

Uso SplFileObject::seek

$file = new SplFileObject('yourfile.txt'); 
$file->seek(123); // seek to line 124 (0-based) 
+0

gracias @JRL pero la búsqueda se basa en bytes? y no en el número de línea? – tinks

+0

gracias @JRL creo que es lo que necesito :) – tinks

+0

Usar splfileobject no no da la funcionalidad que da fopen. ¿Hay alguna manera fácil de convertir este objeto en un recurso fopen? – Madmenyo

1

Debe leer desde el principio. Pero si el archivo nunca/rara vez cambia, puede almacenar en caché los desplazamientos de línea en otro lugar, tal vez en otro archivo.

+0

¿Cómo que almacenar en caché los desplazamientos? cuando llamo al archivo leyendo de nuevo, ¿puedo ir directamente a las líneas restantes que necesito leer? @Ignacio Vazquez-Abrams? – tinks

1

probar esto, la más simple

$buffer=explode("\n",file_get_contents("filename"));//Split data to array for each "\n" 

Ahora el tampón es una matriz y cada índice de matriz contienen cada línea; Para obtener la línea 5

echo $buffer[4]; 
+0

gracias Akhil pero estoy leyendo un archivo muy lata ... – tinks

9

¿Esto funciona para usted?

$file = "name-of-my-file.txt"; 
$lines = file($file); 
echo $lines[67]; // echos line 68 (lines numbers start at 0 (replace 68 with whatever)) 

Sin embargo, es necesario verificar las líneas antes de imprimir. ¿Ningún bien?

+0

gracias @ colores vívidos, pero porque estoy leyendo un archivo grande, como archivos de registro :(tengo que leer los primeros 100 y luego el siguiente solo en Desplazamiento ... así que aunque sé cuál línea para leer desde el siguiente im mirando cómo leer directamente en la línea ... – tinks

0

Puede usar la función file($filename). Esta función lee los datos del archivo en una matriz.

2

Se podría hacer como:

$lines = file($filename); //file in to an array 
echo $lines[1];   //line 2 

O

$line = 0; 
$fh = fopen($myFile, 'r'); 

while (($buffer = fgets($fh)) !== FALSE) { 
    if ($line == 1) { 
     // $buffer is the second line. 
     break; 
    } 
    $line++; 
} 
Cuestiones relacionadas