miércoles, 11 de agosto de 2010

Leer y escribir un archivo de texto línea a línea con PHP

Un ejemplo de como leer un archivo de texto txt línea por línea con php.

//Abrimos el txt generando un puntero hacia el archivo físico
$fp = fopen("archivo.txt");
//recorremos las diferentes lineas de texto
while (!feof) {
  $line = fgets($fp);
  echo $line . "<br />";
}
fclose($fp);
//importante cerrar el archivo al finalizar

También tenemos a nuestra disposición algunos métodos más para realizar este misma tarea, aunque con cierta funcionalidad extra como son fgetss() y fgetcsv().

//fgetss() elimina todos los tags HTML y PHP que encuentre. 
//Si queremos conservar alguno debemos indicarlo en el
//tercer parámetro, como en el siguiente ejemplo
@$fp = fopen($_SERVER['DOCUMENT_ROOT'].'/ruta/archivo.txt', 'rb');
if ($fp) {
 while (!feof($fp)) {
  echo fgetss($fp, 2096, '<strong><br>').'<br />'; 
 }
 fclose($fp);
} else {
 echo 'Error'; 
}

//fgetcsv() se utiliza para dividir las líneas
//según el caracter de delimitación pasado a la función
//imaginemos un archivo con el siguiente texto:
1,nombre cliente 1,codigo cliente 1,estado cliente 1
2,nombre cliente 2,codigo cliente 2,estado cliente 2
//podemos obtener esta información CSV de la siguiente forma:
$l = 1;
if ($fp = fopen($_SERVER['DOCUMENT_ROOT'].'/ruta/archivo.txt', 'rb')) {
 while ($d = fgetcsv($fp, 2096, ",")) {
  $n = count($d); 
  echo "$n campos en la fila $l<br />";
  $l++;
  for ($i = 0; $i < $n; $i++) {
   echo $d[$i].'<br />'; 
  }
  echo '<br /><br />';
 }
 fclose($fp);

} else {
 echo 'Error'; 
}

Para escribir en un archivo de texto prestamos atención a los modificadores de acceso a ficheros.

"r" => Sólo lectura
"w" => Escritura
"a" => Adición
"r+" "w+" => Lectura y escritura
"b" => Binario (se usa en combinación con alguno de los anteriores, se recomienda para maximizar la portabilidad entre sistemas Linux y Windows.

//Escribir en un archivo una nueva línea
$fp = fopen("archivo.txt", "a");
fputs($fp, "\nTexto a escribir");
fclose($fp);

En realidad fputs() es un alias de fwrite(). Otra opción para leer un archivo con php, es mediante el comando file() con el que no se requiere ningún tipo de puntero hacia el fichero, simplemente abre un archivo y devuelve una matriz con cada línea ocupando una posición. El problema con esta opción llega a la hora de manejar archivos muy grandes ya que pueden generar problemas de memoria. En estos casos siempre es mejor hacerlo accediendo al contenido del fichero línea a línea con fgets() como hemos visto antes.

$salida = "";
$archivo = file("archivo.txt");
foreach ($archivo as $linea) {
  $lineaActual = $linea;
  $salida .= rtrim($lineaActual) . "<br />\n";
}
echo $salida;