• Publicidad

Imprimir primer y último elemento de una matriz

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

Imprimir primer y último elemento de una matriz

Notapor lis » 2014-04-23 16:25 @725

¡Hola, perleros!

Ayúdenme, por favor. Tengo un archivo.txt que contiene las siguientes columnas: año, mes, día, hora, velocidad, y dirección de viento. A continuación muestro un extracto del archivo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
2013 1 1 0 1.0 76
2013 1 1 1 1.0 26
2013 1 1 2 0.7 37
2013 1 1 3 0.3 76
2013 1 1 4 0.6 59
2013 1 1 5 0.6 65
2013 1 1 6 0.5 81
2013 1 1 7 0.6 58
2013 1 1 8 0.5 38
2013 1 1 9 1.2 56
2013 1 1 10 1.0 48
2013 1 1 11 0.9 33
2013 1 1 12 1.3 26
2013 1 1 13 1.3 7
2013 1 1 14 1.2 221
. . . . . .
. . . . . .
. . . . . .
2013 12 31 15 2.2 250
2013 12 31 14 nan nan
2013 12 31 15 nan nan
2013 12 31 16 nan nan
2013 12 31 17 nan nan
2013 12 31 18 nan nan
2013 12 31 19 nan nan
2013 12 31 20 nan nan
2013 12 31 21 nan nan
2013 12 31 22 nan nan
2013 12 31 23 nan nan
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Los "nan" significa que no hay datos.

Lo que quiero es imprimir la primera y última fecha del archivo, es decir:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
2013 01 01 00
2013 12 31 23
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

pero si la columna 5 tiene un "nan", imprimir la fecha antes del "nan":
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
2013 01 01 00
2013 12 31 15
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Adjunto mi código.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. use warnings;
  3. use strict;
  4.  
  5. open IN, "<datos.txt";
  6.  
  7. my @array = <IN>;
  8.  
  9. next if $array[5] eq "nan";
  10.  
  11. close IN;
  12.  
  13. my $first = shift (@array);
  14. my $last = pop (@array);
  15.  
  16. print "first: $first";
  17. print "last: $last";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Me imprime la primera y última fecha, pero no toma en cuenta si la columna 5 tiene "nan". Además quiero que se impriman solo las primera cuatro columnas (año, mes, día y hora).

Gracias por su ayuda :D
lis
Perlero nuevo
Perlero nuevo
 
Mensajes: 106
Registrado: 2008-05-27 21:43 @946

Publicidad

Re: Imprimir primer y último elemento de una matriz

Notapor explorer » 2014-04-23 21:47 @949

El "next" es para usarlo dentro de bucles, pero no estás usando ninguno.

Si lo que quieres es filtrar las líneas que no tienen 'nan', pues lo mejor es usar un grep():
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4.  
  5. open IN, "<datos.txt";
  6.  
  7. my @datos = grep { (split " ")[5] ne 'nan' } <IN>;
  8.  
  9. close IN;
  10.  
  11.  
  12. if (@datos) {                           # si hay datos
  13.  
  14.     my $first = $datos[0];              # primera línea
  15.     my $last  = $datos[-1];             # última línea
  16.  
  17.     for ($first, $last) {
  18.         my @columnas = split " ";
  19.  
  20.         print join(" ", @columnas[0..3]), "\n";         # solo las 4 primeras columas
  21.     }
  22. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Otra forma de hacerlo, esta vez con un bucle:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4.  
  5. open IN, '<', 'datos.txt';
  6.  
  7. my @datos;
  8.  
  9. while (<IN>) {                          # para todas las líneas del archivo
  10.  
  11.     my @columnas = split " ";           # separar por los espacios
  12.  
  13.     next if $columnas[5] eq 'nan';      # si es 'nan', no nos interesa
  14.    
  15.     push @datos, $_;                    # guardamos la línea
  16. }
  17.  
  18. close IN;
  19.  
  20.  
  21. if (@datos) {                           # si hay datos
  22.  
  23.     my $first = $datos[0];              # primera línea
  24.     my $last  = $datos[-1];             # última línea
  25.  
  26.     for ($first, $last) {
  27.         my @columnas = split " ";
  28.  
  29.         print join(" ", @columnas[0..3]), "\n";         # solo las 4 primeras columas
  30.     }
  31. }
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: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Imprimir primer y último elemento de una matriz

Notapor lis » 2014-04-24 13:39 @610

Muchas gracias, explorer, funciona excelente.
lis
Perlero nuevo
Perlero nuevo
 
Mensajes: 106
Registrado: 2008-05-27 21:43 @946


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 2 invitados