Foros del Web » Programando para Internet » PHP »

Leer ultima linea de un archivo

Estas en el tema de Leer ultima linea de un archivo en el foro de PHP en Foros del Web. Saludos.. Existe alguna forma de leer la ultima linea de un archivo plano sin utilizar fopen? Gracias!...
  #1 (permalink)  
Antiguo 05/10/2007, 16:15
Avatar de Nano_  
Fecha de Ingreso: febrero-2006
Ubicación: Bogotá, Colombia
Mensajes: 1.866
Antigüedad: 18 años, 2 meses
Puntos: 96
Pregunta Leer ultima linea de un archivo

Saludos..

Existe alguna forma de leer la ultima linea de un archivo plano sin utilizar fopen?

Gracias!
__________________
:.:Nano.:: @nano_hard - Retornando al foro
  #2 (permalink)  
Antiguo 05/10/2007, 17:43
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Re: Leer ultima linea de un archivo

No, necesitas usar fopen y fseek para ir al ultimo del archivo.

Saludos.
  #3 (permalink)  
Antiguo 05/10/2007, 17:54
Avatar de DooBie  
Fecha de Ingreso: septiembre-2004
Mensajes: 1.101
Antigüedad: 19 años, 7 meses
Puntos: 71
Re: Leer ultima linea de un archivo

Cita:
Iniciado por Nano_ Ver Mensaje
Saludos..

Existe alguna forma de leer la ultima linea de un archivo plano sin utilizar fopen?

Gracias!
Facil :p

Código PHP:
$fichero "mi_fichero.txt";
$filas file($fichero);
$ultima_linea $filas[count($filas)-1]; 
Creo que asi lo consigues.

Para mas informacion: http://es.php.net/manual/es/function.file.php
  #4 (permalink)  
Antiguo 06/10/2007, 15:42
 
Fecha de Ingreso: abril-2006
Mensajes: 1.128
Antigüedad: 18 años
Puntos: 33
Re: Leer ultima linea de un archivo

Nano:
Lo que te ha expuesto Doobie es excelente,
aqui te complemento:
<?php
$fichero = "mi_fichero.txt";
$filas = file($fichero);
$ultima_linea = count($filas);
$ultima_linea_escritura = $filas[$ultima_linea];
echo "Aqui esta:<br>";
echo "$ultima_linea_escritura";
?>
Saludos
Y espero te ayude
Franco
  #5 (permalink)  
Antiguo 06/10/2007, 15:56
Avatar de DooBie  
Fecha de Ingreso: septiembre-2004
Mensajes: 1.101
Antigüedad: 19 años, 7 meses
Puntos: 71
Re: Leer ultima linea de un archivo

Cita:
Iniciado por franco190453 Ver Mensaje
Nano:
Lo que te ha expuesto Doobie es excelente,
aqui te complemento:
<?php
$fichero = "mi_fichero.txt";
$filas = file($fichero);
$ultima_linea = count($filas);
$ultima_linea_escritura = $filas[$ultima_linea];
echo "Aqui esta:<br>";
echo "$ultima_linea_escritura";
?>
Saludos
Y espero te ayude
Franco
Yo creo que en el count($filas) se deberia restar 1 para que realmente te de la ultima fila, y no un error de fuera de indice, ya que count() te devuelve el numero de indices de un array, con lo que si tiene 20 indices, te devolvera 20, pero si luego hacemos referencia a ese indice, no existira, ya que en el array se empieza a contar desde 0, con lo que el ultimo, seria el indice 19.

saludos, y muy completo el ejemplo :) esperemos que le sirva la ayuda
  #6 (permalink)  
Antiguo 06/10/2007, 21:14
 
Fecha de Ingreso: abril-2006
Mensajes: 1.128
Antigüedad: 18 años
Puntos: 33
Re: Leer ultima linea de un archivo

DooBie:
Hay varios puntos interesantes:
1.- Si abres un fichero que ya contiene texto entonces lo que tu dices
es cierto. Pero si este archivo va a estar abriendose y cerrandose, agregandole y quitandole o eliminandolo y haciendo uno nuevo; lo que te expongo a continuacion es necesario saber:
2.- Si tu abres un archivo con "fopen" modalidad "a" y este fichero NO
tiene texto (Fichero = 0Kb)en ese momento, La Apertura fallara; en otras palabras
primero tienes que abrirlo con la modalidad "w", agregarle algo y despues "a".
3.- Dado lo del punto numero 2, el codigo debe llevar la apertura que
solo se usara una vez y la modalidad "a" que se utilizara siempre.
FINAL: Lo que se hace al crear el fichero es, agregarle una linea en blanco con <enter> y cerrarlo; entonces el fichero contendra 1Kb. Y la funcion
"fopen" en su modalidad "a" para agregar al fichero no tendra
problemas al abrirse, de la misma manera la funcion "file" funcionara
como lo he explicado desde una perspectiva profesional.
Por lo anterior considero que mi codigo sigue siendo valido ya que depende
el uso del fichero en cuestion.
Saludos
Y espero ayude.
Franco
  #7 (permalink)  
Antiguo 07/10/2007, 04:58
Avatar de DooBie  
Fecha de Ingreso: septiembre-2004
Mensajes: 1.101
Antigüedad: 19 años, 7 meses
Puntos: 71
Re: Leer ultima linea de un archivo

Cita:
Iniciado por franco190453 Ver Mensaje
DooBie:
Hay varios puntos interesantes:
1.- Si abres un fichero que ya contiene texto entonces lo que tu dices
es cierto. Pero si este archivo va a estar abriendose y cerrandose, agregandole y quitandole o eliminandolo y haciendo uno nuevo; lo que te expongo a continuacion es necesario saber:
2.- Si tu abres un archivo con "fopen" modalidad "a" y este fichero NO
tiene texto (Fichero = 0Kb)en ese momento, La Apertura fallara; en otras palabras
primero tienes que abrirlo con la modalidad "w", agregarle algo y despues "a".
3.- Dado lo del punto numero 2, el codigo debe llevar la apertura que
solo se usara una vez y la modalidad "a" que se utilizara siempre.
FINAL: Lo que se hace al crear el fichero es, agregarle una linea en blanco con <enter> y cerrarlo; entonces el fichero contendra 1Kb. Y la funcion
"fopen" en su modalidad "a" para agregar al fichero no tendra
problemas al abrirse, de la misma manera la funcion "file" funcionara
como lo he explicado desde una perspectiva profesional.
Por lo anterior considero que mi codigo sigue siendo valido ya que depende
el uso del fichero en cuestion.
Saludos
Y espero ayude.
Franco
Hola, antes de nada, decir que no pretendo contradecir a nadie, simplemente que cuando pasan cosas asi, pues me gusta corroborar lo que he posteado yo, y lo que han posteado los demas, en este caso tu, me explico:

He estado haciendo pruebas con file(), tal y como tu comentas, he probado con un fichero vacio y con otro fichero con algunas lineas escritas, el script, algo sencillo, es este:

Código:
<?php
	$vacio = "vacio.txt";
	$lleno = "lleno.txt";
	$v = file($vacio); $lv = count($v);	$ulv = $v[$lv - 1];
	$ll = file($lleno); $lll = count($ll); $ulll = $ll[$lll - 1];
?>
ultima linea del fichero vacio: <?php echo $ulv;?><br />
numero de lineas del fichero vacio: <?php echo $lv;?><br />
<hr />
ultima linea del fichero lleno: <?php echo $ulll;?><br />
numero de lineas del fichero lleno: <?php echo $lll;?><br />
Es facil de entender, pero explico mis resultados y conclusiones.
Al leer un fichero con file(), si éste esta vacio, no devolvera ningun error (al menos, a mi no me ha devuelto ninguno, tal vez devuelva un notice...), simplemente en el array lo llenara con 0 indices, con lo que, al mostrar la supuesta ultima linea, simplemente no mostrara nada. Esto siembre usando para coger la ultima linea un (count($array)-1). En cambio, en el fichero lleno, si devuelve la ultima linea, con la recogida de la ultima linea con el (count($array)-1), en cambio, si no le restamos el 1, no devolvera nada, ya que como dije en el otro post, no encuentra el indice especificado.
De todos modos, en el post inicial no se comenta nada de como se va a escribir en el fichero, con lo cual, no podemos profundizar mas :( tampoco nos dicen si el codigo le sirvio o no :(
pus nada mas, espero no crear polemica ni nada, pero es que cuando me encuentro algo asi, lo pruebo, por si estoy equivocado, ya que la funcion file() la suelo usar en algunas paginas en produccion.

Saludos y gracias
  #8 (permalink)  
Antiguo 07/10/2007, 08:30
 
Fecha de Ingreso: abril-2006
Mensajes: 1.128
Antigüedad: 18 años
Puntos: 33
Re: Leer ultima linea de un archivo

DooBie:
En ningun momento dije que la funcion "file" da error cuando el archivo no tiene texto!.
Y la funcion "file" NO es igual a la funcion "fopen". Esta ultima SI devuelve error
cuando el archivo no tiene texto dentro o tiene 0Kb.
LO IMPORTANTE DE TODO ESTO ES QUE EL MANEJO DE UN ARCHIVO DE TEXTO
DENTRO DE UN SCRIPT PHP, GENERALMENTE REQUERIRA DE LA ADICION DE TEXTOS Y EN ESE CASO SE USA LA FUNCION "FOPEN", YA QUE CON ESTA SE PUEDE AGREGAR TEXTO A UN ARCHIVO YA EXISTENTE.
Porfavor, lee con calma lo que he escrito al menos unas dos veces ya que la
ansiedad turba la mente, especialmente lee el punto #2 de mi post.
Saludos
Y espero ayude
Franco
P.S. DooBie, las polemicas, engrandecen los conocimientos!.
  #9 (permalink)  
Antiguo 07/10/2007, 08:58
Avatar de DooBie  
Fecha de Ingreso: septiembre-2004
Mensajes: 1.101
Antigüedad: 19 años, 7 meses
Puntos: 71
Re: Leer ultima linea de un archivo

Cita:
Iniciado por franco190453 Ver Mensaje
DooBie:
En ningun momento dije que la funcion "file" da error cuando el archivo no tiene texto!.
Y la funcion "file" NO es igual a la funcion "fopen". Esta ultima SI devuelve error
cuando el archivo no tiene texto dentro o tiene 0Kb.
LO IMPORTANTE DE TODO ESTO ES QUE EL MANEJO DE UN ARCHIVO DE TEXTO
DENTRO DE UN SCRIPT PHP, GENERALMENTE REQUERIRA DE LA ADICION DE TEXTOS Y EN ESE CASO SE USA LA FUNCION "FOPEN", YA QUE CON ESTA SE PUEDE AGREGAR TEXTO A UN ARCHIVO YA EXISTENTE.
Porfavor, lee con calma lo que he escrito al menos unas dos veces ya que la
ansiedad turba la mente, especialmente lee el punto #2 de mi post.
Saludos
Y espero ayude
Franco
P.S. DooBie, las polemicas, engrandecen los conocimientos!.
tienes razon, hay que re-leer :p

en cualquier caso, a mi me gustaria saber si hemos ayudado en algo al compañero, ya que no dice nada :D



V'sss .... digo... saludos!
  #10 (permalink)  
Antiguo 07/10/2007, 11:15
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Re: Leer ultima linea de un archivo

Como tip para todos, el usar file, carga todo el archivo en memoria, asi que es ineficiente si los archivos son grandes (imaginen un archivo de 20 MB). Les comparto esta funcion que usa fopen/fseek/fget para regresar la ultima linea del archivo, es bastante rapida y no importa el tamaño del archivo:
Código PHP:
<?php
function readLastLine($file) {
    
$fp = @fopen($file"r"); // Abrimos en modo lectura

    
$pos = -1// Empezamos en el ultimo Bit
    
$t " "// Creamos el buffer para regresar
    
while ($t != "\n") { // Ciclamos hasta que encontremos un \n = nueva linea
        
if (!fseek($fp$posSEEK_END)) { // Nos movemos hasta el bit $pos
            
$t fgetc($fp); // Obtenemos un caracter del archivo
            
$pos $pos 1// Restamos 1 bit a $pos
        
} else { // Si no pudimos movernos al final
            
rewind($fp); // regresamos el puntero
            
break; // Salimos del loop
        
}
    }
    
$t fgets($fp); // Obtenemos el ultimo caracter desde la posicion actual
    
fclose($fp); // Cerramos el puntero al archivo
    
return $t// Regresamos la salida
}
?
Saludos
  #11 (permalink)  
Antiguo 07/10/2007, 11:42
 
Fecha de Ingreso: abril-2006
Mensajes: 1.128
Antigüedad: 18 años
Puntos: 33
Re: Leer ultima linea de un archivo

GatorV:
Definitivamente la funcion file NO es muy practica
Y muy interesante y bastante enriquecedor es para mi tu
post, ya que la verdad nunca terminamos de aprender.
Saludos

Y Gracias a ti GatorV.
Y Gracias a DooBie, por permitir profundizar un poco mas
sobre este novedoso lenguaje de programacion php.

Franco

P.S. DooBie, verdaderamente el que inicio este post
debiera al menos comentar algo!.
  #12 (permalink)  
Antiguo 07/10/2007, 13:53
Avatar de DooBie  
Fecha de Ingreso: septiembre-2004
Mensajes: 1.101
Antigüedad: 19 años, 7 meses
Puntos: 71
Re: Leer ultima linea de un archivo

GatorV tienes razon en el problema de un supuesto tamaño escesivo de fichero para usar la funcion file, eso es un problema a tener en cuenta.
Una funcion util y eficaz la que has puesta, gracias.

franco190453, seguro que para mi es mas novedoso este lenguaje :p

saludos!
  #13 (permalink)  
Antiguo 25/10/2007, 17:28
Avatar de Nano_  
Fecha de Ingreso: febrero-2006
Ubicación: Bogotá, Colombia
Mensajes: 1.866
Antigüedad: 18 años, 2 meses
Puntos: 96
Re: Leer ultima linea de un archivo

GRacias a todos por su respuesta... e intentado implementar la funcion que gastorv muy amablemente compartio, pero no la e podido acomodar para mi proposito... BAsicamente lo que necesito es ubicarme en la la antepenultima o ultima linea de archivo plano y verificar si tiene escrito Proceso Ejecutado. Agradezco a la(s) persona(s) que me puedan brindar una idea para ello sin utilizar la funcion file...

Hasta Pronto!
__________________
:.:Nano.:: @nano_hard - Retornando al foro
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 19:25.