• Publicidad

Sustituir datos de un archivo a otro

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

Sustituir datos de un archivo a otro

Notapor lis » 2014-05-13 18:03 @793

Estimados, tengo dos archivos (adjuntos). El archivo uno en sus columnas 5 y 6 contienen algunos nan, y el archivo dos contiene la totalidad de los datos.

Lo que necesito es que los nan del archivo uno se copien en el archivo dos en el mismo lugar. Hice el siguiente código, el cual además de demorarse mucho no hace lo que quiero, ya que solo me copia el archivo dos en un nuevo archivo tres sin los cambios :oops: Por otro lado ¿sería posible reemplazar los nan en el mismo fichero dos sin crear un archivo tres? Les agradezco mucho su aporte.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. open( FICHERO1, '<fichero1.txt' ) or die "$!\n";
  7. open( FICHERO3, '>Archivo3.txt' ) or die "$!\n";
  8.  
  9. while ( my $linea = <FICHERO1> ) {
  10.     my @c = split( " ", $linea );
  11.  
  12.     open( FICHERO2, '<fichero2.txt' ) or die "$!\n";
  13.     while (<FICHERO2>) {
  14.         my @d = split " ";
  15.  
  16.         if ( $d[4] eq 'nan' ) {
  17.             s/$c[4]/$d[4]/g;
  18.         }
  19.     }
  20.     print FICHERO3 join( ' ', @c ), "\n";    # generamos una línea de salida a partir de los @datos modificados
  21.  
  22. }
  23.  
  24. close FICHERO2;
  25. close FICHERO1;
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4

Este código solo lo hice para la columna 5, ya que si lo hago para las columnas 5 y 6 no me funciona :cry:

Sintáxis: (fichero1.txt) [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
2012    1       1       0               2.79            221.17
2012    1       1       1               2.74            256.05
2012    1       1       2               2.25            263.15
2012    1       1       3               1.84            264.75
2012    1       1       4               1.95            259.78
2012    1       1       5               1.34            251.90
2012    1       1       6               2.23            218.13
2012    1       1       7               2.93            238.15
2012    1       1       8               3.91            237.53
2012    1       1       9               2.95            243.66
2012    1       1       10              2.03            235.09
2012    1       1       11              0.35            123.38
2012    1       1       12              1.41            318.69
2012    1       1       13              2.04            292.36
2012    1       1       14              1.35            242.89
2012    1       1       15              2.20            251.55
2012    1       1       16              2.19            210.41
2012    1       1       17              3.01            232.18
2012    1       1       18              4.56            244.67
2012    1       1       19              5.32            237.40
2012    1       1       20              4.36            227.27
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Sintáxis: (fichero2.txt) [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
2012 1 1 0 nan 351
2012 1 1 1 1.1 9
2012 1 1 2 1.5 77
2012 1 1 3 1.8 78
2012 1 1 4 2.4 82
2012 1 1 5 nan 72
2012 1 1 6 2.6 213
2012 1 1 7 3.0 234
2012 1 1 8 2.8 236
2012 1 1 9 2.5 247
2012 1 1 10 2.2 255
2012 1 1 11 3.0 256
2012 1 1 12 4.2 nan
2012 1 1 13 4.5 nan
2012 1 1 14 4.5 242
2012 1 1 15 4.3 243
2012 1 1 16 5.9 239
2012 1 1 17 5.8 237
2012 1 1 18 4.9 237
2012 1 1 19 4.7 239
2012 1 1 20 4.7 236
2012 1 1 21 3.7 237
2012 1 1 22 3.5 223
2012 1 1 23 2.4 219
2012 1 2 0 1.6 219
2012 1 2 1 1.0 264
2012 1 2 2 0.6 11
2012 1 2 3 1.5 65
2012 1 2 4 0.4 256
2012 1 2 5 1.4 250
2012 1 2 6 0.3 280
2012 1 2 7 1.3 225
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
lis
Perlero nuevo
Perlero nuevo
 
Mensajes: 106
Registrado: 2008-05-27 21:43 @946

Publicidad

Re: Sustituir datos de un archivo a otro

Notapor explorer » 2014-05-13 19:25 @850

El error está en la línea 17. Estás haciendo una operación de sustitución sobre la variable $_, pero luego esa variable no la guardas en ningún sitio. Y estás guardando los datos del primer archivo en el tres, no el archivo dos en el tres.

Lo que realmente quieres hacer es
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.             $d[4] = $c[4];
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
o quizás cambiar la línea 20 para que guarde el valor de $_ en el archivo tres.

El programa se demora porque lees todo el archivo dos por cada línea del archivo uno. Solo tienes que hacer una multiplicación y verás que son muchas líneas. Además, es incorrecto: no quieres leer todas las líneas. Solo te interesa leer una línea cada vez.

Así que debes abrir el archivo dos al mismo tiempo que el uno. Y cerrarlo al mismo tiempo. Y leer líneas de la misma manera. Bueno, casi.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. open(FICHERO1, '<fichero1.txt') or die "$!\n";
  7. open(FICHERO2, '<fichero2.txt') or die "$!\n";
  8. open(FICHERO3, '>archivo3.txt') or die "$!\n";
  9.  
  10. while (my $linea = <FICHERO1>) {        # leer una línea del archivo uno mientras no lleguemos al final del archivo
  11.     my @c = split(" ", $linea);         # extraer columnas
  12.  
  13.     my $d = <FICHERO2>;                 # leer una línea del archivo dos
  14.     my @d = split " ", $d;              # extraer columnas
  15.  
  16.     if ( $c[4] eq 'nan' ) {             # si la quinta columna del archivo uno es 'nan'
  17.         $d[4] = $c[4];                  # guardamos el 'nan' en la quinta columna del archivo dos
  18.     }
  19.  
  20.     if ( $c[5] eq 'nan' ) {             # lo mismo para la sexta columna
  21.         $d[5] = $c[5];
  22.     }
  23.  
  24.     print FICHERO3 join(' ', @d), "\n"; # generamos una línea de salida a partir de los datos modificados del archivo dos
  25. }
  26.  
  27. close FICHERO3;                         # cerramos todo
  28. close FICHERO2;
  29. close FICHERO1;
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: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Sustituir datos de un archivo a otro

Notapor lis » 2014-05-19 14:17 @637

Gracias, explorer. Funcionó 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 4 invitados

cron