2011-04-25 77 views
37

Estoy tratando de leer una línea específica de un archivo de texto usando php. Aquí está el archivo de texto:PHP: Leer línea específica del archivo

foo 
foo2 

¿Cómo puedo obtener el contenido de la segunda línea utilizando php? Esto devuelve la primera línea:

<?php 
$myFile = "4-24-11.txt"; 
$fh = fopen($myFile, 'r'); 
$theData = fgets($fh); 
fclose($fh); 
echo $theData; 
?> 

..pero necesito el segundo.

Cualquier ayuda sería muy apreciada

Respuesta

69
$myFile = "4-24-11.txt"; 
$lines = file($myFile);//file in to an array 
echo $lines[1]; //line 2 

file — Reads entire file into an array

+2

Nota: eso debe ser '$ lines [1]' –

+1

Gracias hombre! Esto es exactamente lo que necesitaba! Además, gracias por responder tan rápido. –

+52

si el tamaño del archivo es enorme, esta solución será lenta y ocupará mucha memoria. – Raptor

2

Tienes que rizar el archivo hasta el final del archivo.

while(!feof($file)) 
    { 
    echo fgets($file). "<br />"; 
    } 
    fclose($file); 
+0

No es exactamente lo que necesitaba, pero gracias por responder –

15

Si quisiera hacerlo de esa manera ...

$line = 0; 

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

Alternativamente, abrirlo con file() y el subíndice de la línea con [1].

+0

Así que, básicamente, alimentarlo en una matriz y retirar el segundo elemento. Ya veo. Gracias. –

+0

@Sang La primera solución se acaba de dar para adaptarse a su código como lo es ahora. – alex

5
$myFile = "4-21-11.txt"; 
$fh = fopen($myFile, 'r'); 
while(!feof($fh)) 
{ 
    $data[] = fgets($fh); 
    //Do whatever you want with the data in here 
    //This feeds the file into an array line by line 
} 
fclose($fh); 
+0

Ah. Ya veo. Gracias por responder. :) –

+3

Por cierto, alimentar todo el archivo en una matriz, como con 'file()' o 'file_get_contents()', no se recomienda en la práctica si puede estar usando cualquier archivo grande. Para archivos pequeños, funciona genial. – Phoenix

7

puede utilizar el siguiente para conseguir todas las líneas en el archivo

$handle = @fopen('test.txt', "r"); 

if ($handle) { 
    while (!feof($handle)) { 
     $lines[] = fgets($handle, 4096); 
    } 
    fclose($handle); 
} 


print_r($lines); 

y $lines[1] para su segunda línea

+0

Gracias, hermano! Aprecio el hecho de que hayas respondido. –

14

omg me falta 7 representante para hacer comentarios. Este es el comentario de @Raptor @ & @ Tomm, ya que esta pregunta todavía se muestra muy alta en google serps.

Tiene toda la razón. Para archivos pequeños file($file); está perfectamente bien. Para archivos grandes, es una exageración total. Las matrices php de b/c se comen la memoria como locas.

que acaba de ejecutar una prueba con una pequeña * .csv con un tamaño de archivo de 67MB ~ (1.000.000 líneas):

$t = -microtime(1); 
$file = '../data/1000k.csv'; 
$lines = file($file); 
echo $lines[999999] 
    ."\n".(memory_get_peak_usage(1)/1024/1024) 
    ."\n".($t+microtime(1)); 
//227.5 
//0.22701287269592 
//Process finished with exit code 0 

Y puesto que nadie lo mencionó, sin embargo, me dio el SplFileObject una oportunidad, que me en realidad recientemente descubierto por mí mismo.

$t = -microtime(1); 
$file = '../data/1000k.csv'; 
$spl = new SplFileObject($file); 
$spl->seek(999999); 
echo $spl->current() 
    ."\n".(memory_get_peak_usage(1)/1024/1024) 
    ."\n".($t+microtime(1)); 
//0.5 
//0.11500692367554 
//Process finished with exit code 0 

Esto estaba en mi escritorio Win7 por lo que no es representativo para el entorno de producción, pero aun así ... es la gran diferencia.

+0

Gran respuesta para uno tan tarde a la pregunta, y útil. +1 – Josiah

+0

Solo tenga en cuenta que 'SplFileObject' bloquea el archivo. Entonces, cuando la clase ya no es necesaria, null it (ej. '$ Spl = null;') o se le denegará hacer otras operaciones sobre ese archivo - borrar, renombrar, acceder fuera de la clase, etc. – Wh1T3h4Ck5

3

Si utiliza PHP en Linux, puede intentar lo siguiente para leer el texto, por ejemplo, entre 74 y líneas de 159o:

$text = shell_exec("sed -n '74,159p' path/to/file.log"); 

Esta solución es buena si su archivo es grande.

0

Puede intentar hacer un bucle hasta la línea que desee, no el EOF, y restablecer la variable a la línea cada vez (sin agregarle). En su caso, la 2da línea es el EOF. (A for loop es probablemente más apropiado en mi código a continuación).

De esta forma, el archivo completo no está en la memoria; el inconveniente es que lleva tiempo recorrer el archivo hasta el punto que desea.

<?php 
$myFile = "4-24-11.txt"; 
$fh = fopen($myFile, 'r'); 
$i = 0; 
while ($i < 2) 
{ 
    $theData = fgets($fh); 
    $i++ 
} 
fclose($fh); 
echo $theData; 
?> 
0

me gusta daggett answer pero no hay otra solución se puede obtener probar si el archivo no es lo suficientemente grande.

$file = __FILE__; // Let's take the current file just as an example. 

$start_line = __LINE__ -1; // The same with the line what we look for. Take the line number where $line variable is declared as the start. 

$lines_to_display = 5; // The number of lines to display. Displays only the $start_line if set to 1. If $lines_to_display argument is omitted displays all lines starting from the $start_line. 

echo implode('', array_slice(file($file), $start_line, lines_to_display)); 
6

me gustaría utilizar la clase SplFileObject ...

$file = new SplFileObject("filename"); 
if (!$file->eof()) { 
    $file->seek($lineNumber); 
    $contents = $file->current(); // $contents would hold the data from line x 
} 
+0

#Salute # Método impresionante Revoutionary :) –

0

Esta pregunta es bastante viejo ahora, pero para cualquiera que trate con archivos muy grandes, aquí es una solución que no implique la lectura de cada línea anterior. Esta también fue la única solución que funcionó en mi caso para un archivo con ~ 160 millones de líneas.

<?php 
function rand_line($fileName) { 
    do{ 
     $fileSize=filesize($fileName); 
     $fp = fopen($fileName, 'r'); 
     fseek($fp, rand(0, $fileSize)); 
     $data = fread($fp, 4096); // assumes lines are < 4096 characters 
     fclose($fp); 
     $a = explode("\n",$data); 
    }while(count($a)<2); 
    return $a[1]; 
} 

echo rand_line("file.txt"); // change file name 
?> 

Funciona abriendo el archivo sin leer nada, a continuación, mover el puntero al instante a una posición aleatoria, la lectura de hasta 4096 caracteres a partir de ese punto, entonces agarrar la primera línea completa de sus datos.

Cuestiones relacionadas