varios valores txt todas texto por mostrar lineas linea leer las especifica contar archivos archivo php

php - valores - Cómo leer un archivo grande línea por línea



leer y mostrar archivo de texto en php (13)

Así lo gestiono con archivo muy grande (probado con hasta 100G). Y es más rápido que los fgets ().

$block =1024*1024;//1MB or counld be any higher than HDD block_size*2 if ($fh = fopen("file.txt", "r")) { $left=''''; while (!feof($fh)) {// read the file $temp = fread($fh, $block); $fgetslines = explode("/n",$temp); $fgetslines[0]=$left.$fgetslines[0]; if(!feof($fh) )$left = array_pop($lines); foreach ($fgetslines as $k => $line) { //do smth with $line } } } fclose($fh);

¿Cómo leer un archivo línea por línea en PHP, sin cargarlo completamente en la memoria?

Mi archivo es demasiado grande para abrirlo en la memoria, por lo que siempre tengo errores de memoria.

El tamaño del archivo es de 1 GB.


Función para leer con retorno de matriz

function read_file($filename = ''''){ $buffer = array(); $source_file = fopen( $filename, "r" ) or die("Couldn''t open $filename"); while (!feof($source_file)) { $buffer[] = fread($source_file, 4096); // use a buffer of 4KB } return $buffer; }


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

foreach(file(''myfile.txt'') as $line) { echo $line. "/n"; }


La respuesta obvia no estaba en todas las respuestas. PHP tiene un analizador delimitador de transmisión ordenado disponible hecho exactamente para ese propósito.

$fp=fopen() while ($line = stream_get_line($fp, 1024 * 1024, "/n")) { echo $line; } fclose($fp);


Puede usar la fgets() 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); } else { // error opening the file. }


Puede usar 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;


Si está abriendo un archivo grande, probablemente desee usar Generadores junto con fgets () para evitar cargar todo el archivo en la memoria:

/** * @return Generator */ $fileData = function() { $file = fopen(__DIR__ . ''/file.txt'', ''r''); if (!$file) die(''file does not exist or cannot be opened''); while (($line = fgets($file)) !== false) { yield $line; } fclose($file); };

Úsalo así:

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

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

Nota: los generadores requieren> = PHP 5.5


SplFileObject es útil cuando se trata de tratar archivos grandes.

function parse_file($filename) { try { $file = new SplFileObject($filename); } catch (LogicException $exception) { die(''SplFileObject : ''.$exception->getMessage()); } while ($file->valid()) { $line = $file->fgets(); //do something with $line } //don''t forget to free the file handle. $file = null; }


Tenga cuidado con las cosas ''while (! Feof ... fgets ()'', fgets puede obtener un error (returnfing false) y repetirse en bucle para siempre sin llegar al final del archivo. Codaddict estuvo más cerca de ser correcto, pero cuando su ''while fgets'' el bucle termina, verifique feof; si no es verdadero, entonces tuvo un error.


Una de las soluciones populares a esta pregunta tendrá problemas con la nueva línea de caracteres. Se puede arreglar bastante fácilmente con un simple str_replace .

$handle = fopen("some_file.txt", "r"); if ($handle) { while (($line = fgets($handle)) !== false) { $line = str_replace("/n", "", $line); } fclose($handle); }


Utiliza técnicas de búfer para leer el archivo.

$filename = "test.txt"; $source_file = fopen( $filename, "r" ) or die("Couldn''t open $filename"); while (!feof($source_file)) { $buffer = fread($source_file, 4096); // use a buffer of 4KB $buffer = str_replace($old,$new,$buffer); /// }


foreach (new SplFileObject(__FILE__) as $line) { echo $line; }


if ($file = fopen("file.txt", "r")) { while(!feof($file)) { $line = fgets($file); # do same stuff with the $line } fclose($file); }