• Publicidad

Sobreescribir archivo

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

Sobreescribir archivo

Notapor lis » 2014-05-20 09:53 @453

Estimados, tengo archivos en que las horas van de 0 a 23 (columna 4), pero de repente aparecen archivos en que las horas van de 1 a 24, por lo que hice el siguiente código que corrige las horas para que vayan de 0 a 23:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use diagnostics;
  4.  
  5. while ( my $data = <OBS_*> ) {
  6.  
  7.     open IN, "<$data";
  8.     my $nm = substr( $data, 4,, -4 );
  9.     my $out = 'obs_' . $nm . '.txt';
  10.  
  11.     open( ON, ">$out" );
  12.  
  13.     while (<IN>) {
  14.         chomp;
  15.         my $line_number = 24;
  16.         my $line        = $_;
  17.         my @elements    = split( " ", $line );
  18.  
  19.         if ( $line_number == 24 ) {
  20.             $elements[3] = $elements[3] - 1;
  21.             my $header = join( " ", @elements );
  22.             print ON "$header\n";
  23.         }
  24.     }
  25. }
  26. close IN;
  27. close ON;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Mi pregunta es si en vez de crear el archivo $out donde se guardan los cambios, hay alguna manera de sobreescribir el archivo $data con estos cambios. Les agradezco su ayuda.
Última edición por explorer el 2014-05-20 11:09 @506, 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: Sobreescribir archivo

Notapor explorer » 2014-05-20 11:34 @523

Si el contenido de todo el archivo original está en memoria, puedes realizar el cambio de las horas y luego guardar el resultado en el mismo archivo original.

Con respecto al código, hay cosas que no me gustan...
  • creo que sobra una coma en la línea 8
  • los close() están fuera de los bucles, cuando en realidad deberían estar al mismo nivel que los open()
  • en la línea 19 compruebas si $line_number es igual a 24, lo cual siempre es cierto porque así se lo dices en la línea 15. O sea, que las sentencias dentro del if() siempre se ejecutan
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Sobreescribir archivo

Notapor lis » 2014-05-27 15:55 @705

Hola, amigos del foro. He modificado el código anterior sin éxito. Lo que me gustaría que hiciera el código es que si al leer la columna 3 (la cual corresponde a la hora) y si encuentra el número 24, a toda la columna le reste 1. Lo que consigo con esté código es identificar si existe el 24 pero solo le resta un 1 a ese 24 y no ha toda la columna. Les pido que me ayuden por favor. Sé que puede resultar algo fácil de hacer pero por más que lo intento no lo consigo. Muchas gracias.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open (IN,"<$obs");
  2. my $nm = substr( $obs, 4, -4 );
  3.  
  4. my $out = 'OBS_' . $nm . '.txt';
  5. open (ON,">$out");
  6.  
  7. while(<IN>){
  8. chomp;
  9. @datos= split(" ",$_);
  10. $string=24;
  11.  
  12. if ($datos[3] =~ /$string/) {
  13. $datos[3] -= 1;
  14. }
  15. print ON "@datos\n";
  16. }
  17. close IN;
  18. }}
  19.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
lis
Perlero nuevo
Perlero nuevo
 
Mensajes: 106
Registrado: 2008-05-27 21:43 @946

Re: Sobreescribir archivo

Notapor explorer » 2014-05-27 18:03 @793

Se puede hacer de muchas maneras. Yo he optado por la de leer todo el archivo a memoria, en un array como indicaba en el mensaje anterior:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use autodie;
  4. use File::Slurp;
  5.  
  6. my @archivo_lineas = read_file('kk.txt');               # leemos el archivo
  7.  
  8. my $hay_24;                                             # bandera
  9.  
  10. for (@archivo_lineas) {                                 # para todas las líneas
  11.  
  12.     my @columnas = split;
  13.  
  14.     if ($columnas[3] == 24) {                           # si hemos encontrado un '24'
  15.         $hay_24 = 1;                                    # lo marcamos
  16.         last;                                           # y salimos del bucle (no hace falta mirar más)
  17.     }
  18. }
  19.  
  20. if ($hay_24) {                                          # si hay 24...
  21.  
  22.     open my $ON, '>', 'salida.txt';                     # abrimos archivo de salida
  23.  
  24.     for (@archivo_lineas) {                             # para todas las líneas
  25.  
  26.         my @columnas = split;                           # dividimos
  27.         $columnas[3]--;                                 # decrementamos la cuarta columna
  28.         print $ON join(' ', @columnas), "\n";           # reconstruímos la línea y la sacamos
  29.     }
  30.  
  31.     close $ON;                                          # cerramos
  32. }
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: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

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