• Publicidad

Guardar cada hora en un achivo

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

Guardar cada hora en un achivo

Notapor lis » 2014-03-20 17:18 @762

¡Hola, amigos del foro! Necesito de su ayuda una vez más.

Tengo diez archivos con el formato que está en el archivo adjunto. Bueno, es solo un pequeño extracto de uno de los diez archivos completos, ya que pesan mucho. Como referencia, en este archivo cada fila comienza con -22.29751. La columna 26 (para Perl, la 25) corresponde a la fecha que tiene este formato: AAAMMDDHHMMSS-888888.00000.

Lo que necesito es que al leer la hora de esta columna toda la fila se guarde en un archivo, es decir, que cada vez que encuentre, por ejemplo, la hora cero se guarde la fila completa en un archivo.

Hice el siguiente código pero es demasiado lento y no me respeta los espacios entre cada columna que en este tipo de archivos es muy importante.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. while ( $file = <*.txt> ) {
  4.  
  5.     my %hash = qw (01 31 02 28 03 31 04 30 05 31 06 30 07 31 08 31 09 30 10 31 11 30 12 31);
  6.     foreach my $mes ( sort keys %hash ) {
  7.         foreach my $dia ( '01' .. $hash{$mes} ) {
  8.             foreach my $hora ( '00' .. '23' ) {
  9.  
  10.                 $fecha   = '2013' . $mes . $dia . $hora . '0000-888888.00000';
  11.                 $archivo = 'obs:2013' . '-' . $mes . '-' . $dia . '_' . $hora;
  12.  
  13.                 open( FILE,   "<$file" );
  14.                 open( OUTPUT, ">>$archivo" );
  15.  
  16.                 while ( my $line = <FILE> ) {
  17.                     chomp($line);
  18.                     my @datos = split( " ", $line );
  19.  
  20.                     if ( $datos[25] == $fecha ) {
  21.  
  22.                         print OUTPUT "@datos\n";
  23.                     }
  24.  
  25.                 }
  26.             }
  27.         }
  28.     }
  29.  
  30.     close(FILE);
  31.     close(OUTPUT);
  32. }
  33.  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

Sintáxis: (archivo1.txt) [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1.            -22.29751           -68.89821                CDLC Patio 777         SURFACE DATA FROM SFC station SOURCE    FM-12 SYNOP                                                                               2705.00000         6         0         0         0         0         F         F         F   -888888   -888888      20130101000000-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0
  2.   73800.00000      0   2705.00000      0          NaN      0          NaN      0      2.20000      0    345.90000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0
  3. -777777.00000      0-777777.00000      0      1.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0
  4.       1      0      0
  5.            -22.29751           -68.89821                CDLC Patio 777         SURFACE DATA FROM SFC station SOURCE    FM-12 SYNOP                                                                               2705.00000         6         0         0         0         0         F         F         F   -888888   -888888      20130101010000-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0
  6.   73750.00000      0   2705.00000      0          NaN      0          NaN      0      2.20000      0    332.80000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0
  7. -777777.00000      0-777777.00000      0      1.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0
  8.       1      0      0
  9.            -22.29751           -68.89821                CDLC Patio 777         SURFACE DATA FROM SFC station SOURCE    FM-12 SYNOP                                                                               2705.00000         6         0         0         0         0         F         F         F   -888888   -888888      20130101020000-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0
  10.   73700.00000      0   2705.00000      0          NaN      0          NaN      0      1.00000      0     13.40000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0
  11. -777777.00000      0-777777.00000      0      1.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0
  12.       1      0      0
  13.            -22.29751           -68.89821                CDLC Patio 777         SURFACE DATA FROM SFC station SOURCE    FM-12 SYNOP                                                                               2705.00000         6         0         0         0         0         F         F         F   -888888   -888888      20130101030000-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0
  14.   73660.00000      0   2705.00000      0          NaN      0          NaN      0      0.70000      0     85.40000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0
  15. -777777.00000      0-777777.00000      0      1.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0
  16.       1      0      0
  17.            -22.29751           -68.89821                CDLC Patio 777         SURFACE DATA FROM SFC station SOURCE    FM-12 SYNOP                                                                               2705.00000         6         0         0         0         0         F         F         F   -888888   -888888      20130101040000-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0
  18.   73620.00000      0   2705.00000      0          NaN      0          NaN      0      0.70000      0     80.80000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0
  19. -777777.00000      0-777777.00000      0      1.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0
  20.       1      0      0
  21.            -22.29751           -68.89821                CDLC Patio 777         SURFACE DATA FROM SFC station SOURCE    FM-12 SYNOP                                                                               2705.00000         6         0         0         0         0         F         F         F   -888888   -888888      20130101050000-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0
  22.   73630.00000      0   2705.00000      0          NaN      0          NaN      0      0.50000      0     80.70000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0
  23. -777777.00000      0-777777.00000      0      1.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0-888888.00000      0
  24.       1      0      0
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Ayúdenme, por favor, y muchas gracias :)
Última edición por explorer el 2014-03-20 18:19 @805, editado 1 vez en total
Razón: Formateado de código con Perltidy
lis
Perlero nuevo
Perlero nuevo
 
Mensajes: 106
Registrado: 2008-05-27 21:43 @946

Publicidad

Re: Guardar cada hora en un achivo

Notapor explorer » 2014-03-20 18:49 @826

No necesitas hacer un triple bucle para buscar fechas... si sabemos el aspecto que tiene una fecha, pues la podemos encontrar y capturar con una expresión regular. La fecha capturada la usaremos para abrir el archivo correspondiente y grabar en él la $line.

(A mi me sale que la fecha está en la columna 24, no en la 25)

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. while (my $file = <*.txt>) {
  7.  
  8.     open my $FILE, '<', $file;
  9.  
  10.     while (my $line = <$FILE>) {
  11.         my @columns = split " ", $line;
  12.  
  13.         # Si existe una columna 24, y coincide con una fecha, la tomamos
  14.         if (defined $columns[24]  and  $columns[24] =~ /^(\d{4})(\d{2})(\d{2})(\d{2})0000-888888[.]00000$/) {
  15.             open my $OUTPUT, '>>', "obs:$1-$2-${3}_$4";
  16.             print   $OUTPUT $line;
  17.             close   $OUTPUT;
  18.         }
  19.     }
  20.  
  21.     close $FILE;
  22. }
  23.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Esta es otra versión, un poco más rápida
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5.  
  6. my %fh;                                                         # aquí guardaremos los gestores de archivo
  7.  
  8. while (my $archivo = <*.txt>) {
  9.  
  10.     open my $ARCHIVO, '<', $archivo;
  11.  
  12.     while (my $linea = <$ARCHIVO>) {
  13.         my @columnas = split " ", $linea;
  14.  
  15.         # Si existe una columna 24, y coincide con una fecha, la tomamos
  16.         if (defined $columnas[24]  and  $columnas[24] =~ /^(\d{4})(\d{2})(\d{2})(\d{2})0000-888888[.]00000$/) {
  17.             my $fecha = "$1$2$3$4";
  18.  
  19.             if (not  $fh{$fecha}) {                             # si el archivo no estaba abierto
  20.                 open $fh{$fecha}, '>>', "obs:$1-$2-${3}_$4";    # lo abrimos ahora
  21.             }
  22.  
  23.             print    $fh{$fecha}  $linea;                       # guardamos la línea
  24.         }
  25.     }
  26.  
  27.     close $ARCHIVO;
  28. }
  29.  
  30. for (values %fh) {                                              # cerramos todos los archivos abiertos antes
  31.     close $_;
  32. }
Coloreado en 0.002 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: Guardar cada hora en un achivo

Notapor lis » 2014-03-25 09:19 @429

Hola, explorer, muchas gracias por la ayuda. Solo tengo una pregunta: ¿al guardarse la línea en el archivo ésta podría mantener los retornos de carro que hay al final de las columnas 38, 54 y 66? Gracias, gracias.
lis
Perlero nuevo
Perlero nuevo
 
Mensajes: 106
Registrado: 2008-05-27 21:43 @946

Re: Guardar cada hora en un achivo

Notapor explorer » 2014-03-25 11:01 @501

El archivo es leído por líneas enteras y se escribe por líneas enteras. En ningún momento se le quitan caracteres de fin de línea, o se les pone nuevos.
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: Guardar cada hora en un achivo

Notapor lis » 2014-03-25 13:23 @599

Ok, muchas gracias por la respuesta.
lis
Perlero nuevo
Perlero nuevo
 
Mensajes: 106
Registrado: 2008-05-27 21:43 @946

Re: Guardar cada hora en un achivo

Notapor lis » 2014-03-28 08:45 @406

Consulta. Una vez que se lee el archivo y encuentra la columna correspondiente a la fecha, ¿cómo se pueden copiar las tres filas siguientes (en total cuatro filas incluidas la de la fecha) en el nuevo archivo? Gracias de antemano.
lis
Perlero nuevo
Perlero nuevo
 
Mensajes: 106
Registrado: 2008-05-27 21:43 @946

Re: Guardar cada hora en un achivo

Notapor explorer » 2014-03-28 14:49 @659

Entre las líneas 17 y 18 (del primer código, por ejemplo) añades esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.             my $linea_extra;
  2.             for (1..3) {
  3.                 $linea_extra = <$FILE>;
  4.                 print $OUTPUT $linea_extra;
  5.               }
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: Guardar cada hora en un achivo

Notapor lis » 2014-04-03 09:27 @435

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: No hay usuarios registrados visitando el Foro y 21 invitados