¿Cómo leer un archivo grande línea por línea?

Resuelto adnan masood asked hace 54 años • 0 respuestas

Quiero leer un archivo línea por línea, pero sin cargarlo por completo en la memoria.

Mi archivo es demasiado grande para abrirlo en la memoria y, si intento hacerlo, siempre obtengo errores de falta de memoria.

El tamaño del archivo es de 1 GB.

adnan masood avatar Jan 01 '70 08:01 adnan masood
Aceptado

Puede utilizar la fgets()función para leer el archivo línea por línea:

$handle = fopen("inputfile.txt", "r");
if ($handle) {
    while (($line = fgets($handle)) !== false) {
        // process the line read.
    }

    fclose($handle);
}
codaddict avatar Nov 06 '2012 07:11 codaddict
if ($file = fopen("file.txt", "r")) {
    while(!feof($file)) {
        $line = fgets($file);
        # do same stuff with the $line
    }
    fclose($file);
}
Syuaa SE avatar Nov 06 '2012 07:11 Syuaa SE

Puede utilizar una clase de interfaz orientada a objetos para un archivo: SplFileObject http://php.net/manual/en/splfileobject.fgets.php (PHP 5 >= 5.1.0)

<?php

$file = new SplFileObject("file.txt");

// Loop until we reach the end of the file.
while (!$file->eof()) {
    // Echo one line from the file.
    echo $file->fgets();
}

// Unset the file to call __destruct(), closing the file handle.
$file = null;
elshnkhll avatar Oct 04 '2014 05:10 elshnkhll

Si desea utilizar foreachen lugar de whileal abrir un archivo grande, probablemente desee encapsular el whilebucle dentro de un Generador para evitar cargar todo el archivo en la memoria:

/**
 * @return Generator
 */
$fileData = function() {
    $file = fopen(__DIR__ . '/file.txt', 'r');

    if (!$file) {
        return; // die() is a bad practice, better to use return
    }    
    while (($line = fgets($file)) !== false) {
        yield $line;
    }

    fclose($file);
};

Úselo así:

foreach ($fileData() as $line) {
    // $line contains current line
}

De esta manera puede procesar líneas de archivos individuales dentro de foreach().

Nota: Los generadores requieren >= PHP 5.5

The Onin avatar Mar 27 '2017 17:03 The Onin

Hay una file()función que devuelve una matriz de las líneas contenidas en el archivo.

foreach(file('myfile.txt') as $line) {
   echo $line. "\n";
}
NYG avatar Apr 09 '2015 07:04 NYG