• Publicidad

Buscar en un archivo de texto

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Buscar en un archivo de texto

Notapor ivanlog19 » 2009-09-21 13:06 @588

Hola,

supongamos que tengo un archivo de texto que se llama texto.txt y es así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
bla bla bla oihsa
ljhaf paijf a

CLAVE: hola
ljsg

lasjg
CLAVE: chau
lkj

jo
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Quiero recorrerlo y guardar en variables las palabras que están después de CLAVE.
¿Cómo puedo hacer esto?

Voy haciendo esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open(FILEHANDLE, "$rutaArchivo") || die "ERROR: no pude abrir el archivo: $!";
my @datos = $procesador->parsear(FILEHANDLE);

# en otro módulo tengo definida la subrutina parsear:
sub parsear { #recibe un archivo de texto y devuelve una lista con lo que quiero
        my $texto = \@_[0];
       
        $texto =~ m/.*CLAVE:(.*) .*CLAVE: (.*) .*/;
        my @datosRetornar = ();
        push (@datosRetornar, $1);
        push (@datosRetornar, $2);

        return @datosRetornar;
}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Primero: esto no funciona, no sé bien cómo es el tema de pasar referencias como parámetros.
Segundo: si no sé cuantas "CLAVE" van a haber, ¿cómo puedo hacer?

¡¡Agradezco cualquier ayuda!!
Última edición por explorer el 2009-09-21 13:24 @600, editado 2 veces en total
Razón: Ortografía
ivanlog19
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2009-09-18 15:24 @683
Ubicación: Montevideo - Uruguay

Publicidad

Re: Buscar en un archivo de texto

Notapor explorer » 2009-09-21 13:21 @598

Bienvenido a los foros de Perl en Español, ivanlog19.

No queda muy claro que quieres decir con "guardar en variables".

Sería interesante saber para qué necesitas realizar esa lectura. Es decir, si suponemos que quieres leer esa información para guardarla en variables y hay varias CLAVES, eso quiere decir que necesitarás hacer un bucle para procesar de forma repetida esos valores. O quizás meter todo lo leído en un arreglo (array) y luego, más tarde, procesar ese arreglo.

Actualización: después de revisar un poco el código se ve que falta poco para terminarlo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. my $rutaArchivo = 'kk.txt';
  7.  
  8. open(my $file, "$rutaArchivo") or die "ERROR: no pude abrir el archivo: $!";
  9.  
  10. my @datos = parsear($file);
  11.  
  12. print join('-', @datos), "\n";
  13.  
  14. sub parsear {
  15.     my $fh = shift;
  16.     my @datosRetornar;
  17.  
  18.     while ( <$fh> ) {
  19.         if (m/^CLAVE:\s*(.*?)$/) {
  20.             push @datosRetornar, $1;
  21.         }
  22.     }
  23.     return @datosRetornar;
  24. }
  25.  
  26. __END__
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Bueno, no sé si esta era la idea, pero al menos, funciona.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Buscar en un archivo de texto

Notapor ivanlog19 » 2009-09-21 13:28 @603

Gracias por la bienvenida y por la rápida respuesta.

Lo que quiero es buscar en un archivo de texto todas las veces que aparece una palabra y guardar la palabra que esta a continuación de dicha palabra en un arreglo;

si la palabra es, como en el ejemplo "CLAVE" quiero que guarde en un arreglo la primer palabra que esta después de cada palabra que sea "CLAVE".

Por ejemplo, en el ejemplo de archivo que puse quiero que la subrutina parsear me retorne un array con hola y chau (o sea, @datos = ('hola','chau') )

Espero se entienda, cualquier cosa lo trato de explicar mejor.

¡¡Gracias!!
Última edición por explorer el 2009-09-21 13:37 @609, editado 1 vez en total
Razón: Ortografía
ivanlog19
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2009-09-18 15:24 @683
Ubicación: Montevideo - Uruguay

Re: Buscar en un archivo de texto

Notapor explorer » 2009-09-21 13:42 @612

¡Ah!, entonces es mucho más fácil: vas leyendo línea por línea, y en cada una miras a ver si está la CLAVE. Si es así, capturas el resto y lo vas guardando.

Ya he modificado el mensaje anterior con esa solución.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Buscar en un archivo de texto

Notapor ivanlog19 » 2009-09-21 14:14 @635

¡Excelente!

Pero si ahora quiero que la función parsear esté en otro módulo, ¿cómo hago?

Ya que al hacer lo mismo que si estuviera en el mismo módulo me dice lo siguiente de la variable que le paso "Not a GLOB reference".

¡Gracias nuevamente!
ivanlog19
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2009-09-18 15:24 @683
Ubicación: Montevideo - Uruguay

Re: Buscar en un archivo de texto

Notapor explorer » 2009-09-21 14:45 @656

¿Cómo que cómo lo haces? Pero si pones en el anterior código que ya lo tenías dividido en el otro módulo.

Solo tienes que adoptar el código que hay dentro de la función a lo que tienes.

Si te sale un error, sería recomendable ver el código que falla.

Por lo que dices, parece que el error está en el paso del argumento a la función, y ésta no es capaz de leerlo correctamente.

P.D: Recuerda que estamos en el foro Intermedio :)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Buscar en un archivo de texto

Notapor ivanlog19 » 2009-09-21 15:28 @686

OK.

Una última pregunta, ¿cómo hago para guardar, en vez de lo que está a continuación de la palabra "CLAVE", lo que está en el renglón de abajo de "CLAVE" (suponiendo que siempre el renglón de abajo de uno que empieza con "CLAVE" empieza con "PARA", y quiero guardar la palabra que esta a continuación de "PARA")?

Traté de hacer algo así, pero no pude:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     while ( <$fh> ) {
  2.         if (m/^CLAVE:.*/){
  3.             <$fh>; #trate de hacer esto para que pase a la prox. línea
  4.  
  5.             m/^PARA\s*(.*)\s*/; #busco la palabra siguiente a 'PARA'
  6.             push (@datosRetornar, $1);
  7.         }
  8.     }
  9. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2009-09-21 16:51 @744, editado 1 vez en total
Razón: Ortografía, indentación del código
ivanlog19
Perlero nuevo
Perlero nuevo
 
Mensajes: 14
Registrado: 2009-09-18 15:24 @683
Ubicación: Montevideo - Uruguay

Re: Buscar en un archivo de texto

Notapor explorer » 2009-09-21 16:53 @745

Tienes que meter a la expresión regular en una condición, como la de CLAVE.

Sería más claro ver un ejemplo real del texto que quieres tratar...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 11 invitados