• Publicidad

Reemplazar por el dato siguiente

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

Reemplazar por el dato siguiente

Notapor lis » 2014-07-03 09:58 @456

Hola, nuevamente necesito de su gran ayuda. Tengo un archivo que contienen 6 columnas y la última tiene la palabra Calma, la cual debo reemplazar por el valor anterior, pero en algunos casos comienza con esta palabra, en ese caso se debe reemplazar por el valor siguiente.

Este es un extracto del archivo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
2013 2 1 0 0.3 Calma
2013 2 1 100 0.2 350
2013 2 1 200 0.6 344
2013 2 1 300 0.4 Calma
2013 2 1 400 0.2 Calma
2013 2 1 500 0.8 352
2013 2 1 600 0.9 347
2013 2 1 700 0.6 159
2013 2 1 800 1.9 179
2013 2 1 900 2.1 184
2013 2 1 1000 3.8 221
2013 2 1 1100 4.7 211
2013 2 1 1200 4.6 211
2013 2 1 1300 4.3 212
2013 2 1 1400 4.3 212
2013 2 1 1500 4.4 212
2013 2 1 1600 4.4 211
2013 2 1 1700 5.2 205
2013 2 1 1800 3.9 211
2013 2 1 1900 2.6 208
2013 2 1 2000 0.4 Calma
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Por lo que debiera quedar así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
2013 2 1 0 0.3 350
2013 2 1 100 0.2 350
2013 2 1 200 0.6 344
2013 2 1 300 0.4 344
2013 2 1 400 0.2 344
2013 2 1 500 0.8 352
2013 2 1 600 0.9 347
2013 2 1 700 0.6 159
2013 2 1 800 1.9 179
2013 2 1 900 2.1 184
2013 2 1 1000 3.8 221
2013 2 1 1100 4.7 211
2013 2 1 1200 4.6 211
2013 2 1 1300 4.3 212
2013 2 1 1400 4.3 212
2013 2 1 1500 4.4 212
2013 2 1 1600 4.4 211
2013 2 1 1700 5.2 205
2013 2 1 1800 3.9 211
2013 2 1 1900 2.6 208
2013 2 1 2000 0.4 208
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


He intentado muchas cosas pero no lo consigo. Muchas gracias a todos.
lis
Perlero nuevo
Perlero nuevo
 
Mensajes: 106
Registrado: 2008-05-27 21:43 @946

Publicidad

Re: Reemplazar por el dato siguiente

Notapor explorer » 2014-07-03 10:42 @487

Dices que lo has intentado de muchas maneras. Publica la versión que más éxito tiene y veremos qué te falta.

¿Qué hacemos con el caso extremo, que en todas las líneas salga Calma?
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: Reemplazar por el dato siguiente

Notapor lis » 2014-07-03 11:10 @507

Hola, explorer. Lo único que consigo con este código es eliminar las Calma:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open my $DATOS,    '<', 'archivo.txt' or die $!;
  2. open my $ARCHIVOS, '>', 'salida.txt'  or die $!;
  3.  
  4. while ( my $linea = <$DATOS> ) {
  5.     chop($linea);
  6.     @datos = split( " ", $linea );
  7.     if ( $datos[5] eq 'Calma' ) {
  8.         $datos[5] = next;
  9.     }
  10.  
  11.     print $ARCHIVOS join( ' ', @datos ), "\n";
  12. }
  13.  
  14. close($ARCHIVOS);
  15. close($DATOS);
  16.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
lis
Perlero nuevo
Perlero nuevo
 
Mensajes: 106
Registrado: 2008-05-27 21:43 @946

Re: Reemplazar por el dato siguiente

Notapor explorer » 2014-07-03 13:07 @588

¿ $datos[5] = next ?

Eso no es muy Perl, que digamos...

Perl sobre entiende algunas cosas... pero no tanto como para leernos el pensamiento ;)
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: Reemplazar por el dato siguiente

Notapor explorer » 2014-07-03 16:37 @734

Esta es una solución, sin leer todas las líneas.
Sintáxis: (code_37400.pl) [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. #===============================================================================
  3. #
  4. #         FILE: code_37400.pl
  5. #
  6. #        USAGE: ./code_37400.pl  
  7. #
  8. #  DESCRIPTION: Quitar la Calma
  9. #
  10. #       AUTHOR: JOAQUÍN FERRERO (explorer),
  11. # ORGANIZATION: perlenespanol.com
  12. #      VERSION: 1.0
  13. #      CREATED: 03/07/14 23:17:01
  14. #     REVISION: ---
  15. #===============================================================================
  16.  
  17. use v5.14;
  18. use autodie;
  19. use utf8;
  20.  
  21. open my $ARCHIVO, '<', 'code_37400.txt';                        # abrir archivos
  22. open my $SALIDA,  '>', 'code_37400_out.txt';
  23.  
  24. my $valor_anterior;                                             # recuerdo del valor anterior
  25.  
  26. while (my $línea = <$ARCHIVO>) {                               # para todas las líneas...
  27.     my @columnas = split " ", $línea;                          # las partimos en columnas
  28.  
  29.     if ($columnas[-1] eq 'Calma') {                             # si la última columna es 'Calma'...
  30.  
  31.         if (defined $valor_anterior) {                          # y tenemos un $valor_anterior...
  32.             $columnas[-1] = $valor_anterior;                    # ponemos nuevo valor, que es el anterior
  33.         }
  34.         else {                                                  # estamos en el caso de la primera línea
  35.             my $posición_lectura_archivo = tell $ARCHIVO;      # posición actual de lectura
  36.             $línea = <$ARCHIVO>;                               # leemos la $línea siguiente
  37.             my @columnas_siguiente_línea = split " ", $línea; # partimos
  38.             $columnas[-1] = $columnas_siguiente_línea[-1];     # sacamos el valor
  39.             seek $ARCHIVO, $posición_lectura_archivo, 0;       # reposicionamos
  40.         }
  41.     }
  42.  
  43.     $valor_anterior = $columnas[-1];                            # recordaremos el valor anterior para la siguiente
  44.  
  45.     say $SALIDA join " ", @columnas;                            # salida
  46. }
  47.  
  48. close $ARCHIVO;                                                 # cerrar
  49. close $SALIDA;
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: Reemplazar por el dato siguiente

Notapor explorer » 2014-07-03 16:56 @747

Esta es otra versión, pero usando Tie::File... que es una de las mejores opciones para cuando tenemos que movernos entre líneas.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. #===============================================================================
  3. #
  4. #         FILE: code_37400.pl
  5. #
  6. #        USAGE: ./code_37400.pl  
  7. #
  8. #  DESCRIPTION: Quitar la Calma
  9. #
  10. #       AUTHOR: JOAQUÍN FERRERO (explorer),
  11. # ORGANIZATION: perlenespanol.com
  12. #      VERSION: 2.0
  13. #      CREATED: 03/07/14 23:54:40
  14. #     REVISION: ---
  15. #===============================================================================
  16.  
  17. use v5.14;
  18. use autodie;
  19. use utf8;
  20.  
  21. use Tie::File;
  22.  
  23. tie my @líneas, 'Tie::File', 'code_37400.txt';
  24.  
  25.  
  26. for (my $i = 0; $i < @líneas; $i++) {          # para todas las líneas
  27.  
  28.     my @columnas = split " ", $líneas[$i];     # la partimos
  29.  
  30.     if ($columnas[-1] eq 'Calma') {
  31.  
  32.         if ($i != 0) {                                          # si no estamos en la primera línea
  33.             $columnas[-1] = (split " ", $líneas[$i-1])[-1];    # la nueva última columna será la de la línea anterior
  34.         }
  35.         else {                                                  # si estamos en la primera
  36.             $columnas[-1] = (split " ", $líneas[$i+1])[-1];    # la nueva última columna será la de la siguiente
  37.         }
  38.  
  39.         $líneas[$i] = join " ", @columnas;
  40.     }
  41. }
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: Reemplazar por el dato siguiente

Notapor explorer » 2014-07-03 17:07 @755

Y esta es una tercera versión, uniendo los dos trucos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. #===============================================================================
  3. #
  4. #         FILE: code_37400.pl
  5. #
  6. #        USAGE: ./code_37400.pl  
  7. #
  8. #  DESCRIPTION: Quitar la Calma
  9. #
  10. #       AUTHOR: JOAQUÍN FERRERO (explorer),
  11. # ORGANIZATION: perlenespanol.com
  12. #      VERSION: 3.0
  13. #      CREATED: 04/07/14 00:03
  14. #     REVISION: ---
  15. #===============================================================================
  16.  
  17. use v5.14;
  18. use autodie;
  19. use utf8;
  20.  
  21. use Tie::File;
  22.  
  23. tie my @líneas, 'Tie::File', 'code_37400.txt';
  24.  
  25. my $valor_anterior;
  26.  
  27. for (my $i = 0; $i < @líneas; $i++) {          # para todas las líneas
  28.  
  29.     my @columnas = split " ", $líneas[$i];     # la partimos
  30.  
  31.     if ($columnas[-1] eq 'Calma') {             # si estamos en calma
  32.  
  33.         $columnas[-1]                           # la nueva última columna
  34.             = $i == 0                           # si es la primera línea
  35.             ? (split " ", $líneas[$i+1])[-1]   # la tomamos de la siguiente
  36.             : $valor_anterior                   # el resto, es el valor leído anterior
  37.             ;
  38.  
  39.         $líneas[$i] = join " ", @columnas;     # cambiamos la línea
  40.     }
  41.  
  42.     $valor_anterior = $columnas[-1];            # recordar para la siguiente
  43. }
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: Reemplazar por el dato siguiente

Notapor lis » 2014-07-11 15:30 @688

Muchas, muchas gracias, explorer, por la ayudada brindada, y gracias también porque a pesar de que trato de estudiar Perl me cuesta llevarlo a la práctica y con tus códigos me es más fácil aplicarlos y entenderlos.
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 8 invitados