• Publicidad

Leer fichero de la línea n a la m

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Leer fichero de la línea n a la m

Notapor yiyi_jr » 2012-12-29 12:42 @571

Buenas tardes,

Antes de nada agradecer las aportaciones y explicaciones publicadas en el foro, ya que me han sido de gran utilidad.

Soy nuevo en Perl, llevo menos de una semana, y tengo las siguientes dudas (que ya he buscado y no consigo encontrar).

* ¿Hay alguna manera de mostrar un fichero de la línea n a la m (ejemplo: de la 10 a la 20)?


Posiblemente tendré mas dudas al respecto, pero prefiero seguir intentando lo que quiero con este aporte.

Muchas gracias de antemano y un saludo.
yiyi_jr
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2012-12-29 12:38 @568

Publicidad

Re: Leer fichero de la línea n a la m

Notapor explorer » 2012-12-29 14:14 @635

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

Pues sí, si que hay maneras, y unas cuantas...

Aquí te pongo un par de ellas.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use autodie;
  4.  
  5. open my $ARCHIVO, '<', 'archivo.txt';   # abrimos el archivo
  6.  
  7. while (<$ARCHIVO>) {                    # para cada línea, mientras no lleguemos al final
  8.     if ($. >= 10  and  $. <= 20) {      # ¿el número de línea está entre 10 y 20?
  9.         print;                          # sí, la imprimimos
  10.     }
  11. }
  12.  
  13. close $ARCHIVO;                         # cerramos y nos vamos
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use autodie;
  4.  
  5. open my $ARCHIVO, '<', 'archivo.txt';   # abrimos el archivo
  6.  
  7. while (<$ARCHIVO>) {                    # para cada línea, mientras no lleguemos al final
  8.     if (10 .. 20) {                     # ¿el número de línea está entre 10 y 20?
  9.         print;                          # sí, la imprimimos
  10.     }
  11. }
  12.  
  13. close $ARCHIVO;                         # cerramos y nos vamos
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Puede incluso hacerse desde la propia línea de comandos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. perl -ne 'print if 10 .. 20' archivo.txt
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Más información en tu propio ordenador en perldoc perlop, y en la Web (traducido al español).
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: Leer fichero de la línea n a la m

Notapor yiyi_jr » 2012-12-30 03:09 @173

Muchas gracias por la respuesta, lo que quiero conseguir es algo más complicado, y creo que no pregunté lo que necesitaba :D

Expongo el caso:

Tengo un fichero de texto que contiene la siguiente estructura:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Dom 30 Dic hh:mm:ss 2012
ERROR-00400:.................(dentro de las fechas tengo que buscar un error si lo hubiera).
Dom 30 Dic hh:mm:ss 2012
no hay error
Dom 30 Dic hh:mm:ss 2012
no hay error
Dom 30 Dic hh:mm:ss 2012
ERROR-00400:.................
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Lo que querría hacer es que busque los errores (siempre empiezan por la misma tipología), y si los encuentra, que me muestre lo siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Dom 30 Dic hh:mm:ss 2012
ERROR-00400:.................(dentro de las fechas tengo que buscar un error si lo hubiera).
Dom 30 Dic hh:mm:ss 2012
ERROR-00400:.................
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Hasta el momento solo he conseguido que me saque las líneas de los errores y las de las fechas (pero todas, no solo la de la hora del error).

El código que tengo es este:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open( MIFICH, "xxxxx.txt" ) || die "lo siento, no puedo abrir xxxxx.txt\n";
  2.  
  3. while ( $linea = <MIFICH> ) {
  4.     $numLinea = 0;
  5.     if ( $linea =~ /ERROR-/
  6.         )                              # if ( $linea =~ /ERROR-/ or $linea =~ $fechHoy) ..         Con esto sacamos todas los errores y las horas...
  7.     {
  8.  
  9.         #$numLinea="$.";    # guardamos el numero de linea
  10.  
  11.         print $linea;
  12.     }
  13. }
  14. close(MIFICH);
  15.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Alguna sugerencia/solución?

¡Muchas gracias de antemano!
Un saludo.

PD: Intenté hacerlo como cadena de texto, metiendo todo el fichero en una cadena y trabajando con ella, pero me pasa lo mismo, no consigo mostrar nada más que los errores.
yiyi_jr
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2012-12-29 12:38 @568

Re: Leer fichero de la línea n a la m

Notapor explorer » 2012-12-30 13:00 @583

Si lo que queremos es sacar la línea anterior al error y la línea del error, solo hay que recordar la línea anterior, ya que la línea del error es la actual que estamos leyendo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use autodie;                    # «Es mejor morir que regresar con deshonor» --proverbio Klingon
  4.  
  5. my $linea_anterior = '';
  6.  
  7. open my $ARCHIVO, '<', 'kk.txt';
  8.  
  9. while (my $linea = <$ARCHIVO>) {
  10.  
  11.     if ($linea =~ /^ERROR/) {     # si estamos en una línea de error
  12.         print $linea_anterior;    # pintamos las dos líneas
  13.         print $linea;
  14.     }
  15.  
  16.     $linea_anterior = $linea;     # en la vuelta siguiente, la $linea anterior será la $linea actual
  17. }
  18.  
  19. close $ARCHIVO;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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: Leer fichero de la línea n a la m

Notapor yiyi_jr » 2013-01-01 11:38 @526

Muchas gracias de nuevo, explorer.

Una última cosa: si quisiera sacar en vez de la anterior, las dos anteriores, ¿cómo sería?

¡¡Muchas gracias por adelantado!!

Un saludo.
yiyi_jr
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2012-12-29 12:38 @568

Re: Leer fichero de la línea n a la m

Notapor explorer » 2013-01-01 13:21 @598

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use autodie;                           # «Es mejor morir que regresar con deshonor» --proverbio Klingon
  4.  
  5. my $linea_anterior_a_la_anterior = '';
  6. my $linea_anterior               = '';
  7.  
  8. open my $ARCHIVO, '<', 'kk.txt';
  9.  
  10. while ( my $linea = <$ARCHIVO> ) {
  11.  
  12.     if ( $linea =~ /^ERROR/ ) {                 # si estamos en una línea de error
  13.         print $linea_anterior_a_la_anterior;    # pintamos las tres líneas
  14.         print $linea_anterior;
  15.         print $linea;
  16.     }
  17.     $linea_anterior_a_la_anterior = $linea_anterior;
  18.     $linea_anterior               = $linea;
  19. }
  20.  
  21. close $ARCHIVO;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Pero esto no es escalable. Es mejor pensar entonces en Tie::File.
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: Leer fichero de la línea n a la m

Notapor yiyi_jr » 2013-01-04 13:19 @596

¡¡¡Muchas gracias!!! Era lo que necesitaba, modificándolo un poco me sirvió para lo que quería. De nuevo, ¡¡¡muchísimas gracias!!!
yiyi_jr
Perlero nuevo
Perlero nuevo
 
Mensajes: 4
Registrado: 2012-12-29 12:38 @568


Volver a Básico

¿Quién está conectado?

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