• Publicidad

Buscar y reemplazar palabra en txt

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

Buscar y reemplazar palabra en txt

Notapor gustavobarra » 2011-05-13 14:56 @663

Hola, soy nuevo en Perl y quisiera que me ayuden con esto.

Tengo un archivo txt de un tamaño muy grande con muchas columnas y tengo que cambiar el contenido de una columna por el contenido de otra columna del mismo archivo. Ej.

ColA ColB ColC ColD

tengo que copiar el contenido de la ColB en la ColD

Muchas gracias.
gustavobarra
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2011-05-13 14:44 @655

Publicidad

Re: buscar y reemplazar palabra en txt

Notapor ileiva » 2011-05-13 16:28 @728

Hola.

Suponiendo que el cambio de columnas se hace en cada línea del fichero, aquí hay una solución:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3.  
  4. # se obtiene el nombre del archivo por argumento
  5. my $file = shift;
  6. # $newfile sera el archivo donde se guarden los cambios
  7. my $newfile = 'newfile.txt';
  8.  
  9. # Se abre el archivo a tratar en modo lectura
  10. open my $F, '<', $file or die $!;
  11. my @content = <$F>;
  12. close $F;
  13.  
  14. print "Comenzando reemplazo\n";
  15.  
  16. # Se abre un nuevo archivo en modo escritura
  17. open my $NF, '>', $newfile or die $!;
  18.  
  19. foreach my $line(@content){
  20.         # Aqui se hace efectivo el cambio o reemplazo
  21.         $line =~ tr/ColD/ColB/;
  22.         print {$NF} $line;
  23. }
  24.  
  25. close $NF;
  26.  
  27. # Se renombra el archivo
  28. rename $newfile, $file;
  29.  
  30. print "Reemplazo finalizado\n";
  31.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


El archivo de entrada para este archivo es así:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. ColA ColB ColC ColD 
  2. ColA1 ColB1 ColC1 ColD1 
  3. ColA2 ColB2 ColC2 ColD2 


Y el archivo generado queda así:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. ColA ColB ColC ColB 
  2. ColA1 ColB1 ColC1 ColB1 
  3. ColA2 ColB2 ColC2 ColB2 


Debes llamar al script de esta manera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. perl reemplaza.pl archivo.txt
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Donde archivo.txt es el archivo que quieres tratar.

Ahora bien, si a priori no sabes el valor de las columnas pero sí el tipo de datos y el orden en el que estarán entonces puedes utilizar expresiones regulares. En tal caso serviría que pusieras algún ejemplo de archivo de entrada.

Por ejemplo, si las columnas fueran sólo números del 1 al 4, se puede modificar la parte del reemplazo por esta:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. if($line =~ /(\d+)\s+(\d+)\s+(\d+)\s+(\d+)/){
  2.        $line =~ tr/$4/$2/;
  3. }
  4. print {$NF} $line;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


En este caso un archivo de entrada sería así:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. 1 2 3 4 
  2. 1 2 3 4 
  3. 1 2 3 4 


Y el archivo de salida quedaría así:
Sintáxis: [ Descargar ] [ Ocultar ]
  1. 1 2 3 2 
  2. 1 2 3 2 
  3. 1 2 3 2 


Como dije anteriormente, todo depende del archivo de entrada que recibas.

Espero te sirva.

Saludos.
Última edición por ileiva el 2011-05-15 13:38 @610, editado 1 vez en total
Avatar de Usuario
ileiva
Perlero nuevo
Perlero nuevo
 
Mensajes: 30
Registrado: 2011-04-23 03:25 @184
Ubicación: Santiago, Chile

Re: Buscar y reemplazar palabra en txt

Notapor explorer » 2011-05-13 18:09 @798

Bienvenido a los foros de Perl en español, gustavobarra.

Habría que saber antes lo significativos que son los separadores... ¿son siempre espacios en blanco? ¿se pueden cambiar, por ejemplo, por un simple tabulador? ¿hay valores en todas las columnas, en todas las filas?
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: Buscar y reemplazar palabra en txt

Notapor pvaldes » 2011-05-15 05:26 @268

Si lo he entendido bien imagino que cuando dices colB te refieres a una variable con el contenido de la columna B, (no a un string de 4 letras c+o+l+B), por tanto la traducción tal y como está planteada no funcionará.

Yo cogería la línea, la separaría con split() y luego imprimiría directamente para cada línea

columna A + columna B + columna C + columna B

a un archivo

Si, como ha dicho explorer, los espacios son consistentes, hacer lo mismo con awk fuera de Perl es realmente sencillo

awk '{print $1, $2, $3, $2}'
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

Re: Buscar y reemplazar palabra en txt

Notapor gustavobarra » 2011-05-16 05:33 @273

Hola, muchas gracias por las respuesta que me ofrecieron. Les cuento cómo es el tipo de archivo de entrada.

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
201025 OBREGON  0 00 01 01 017 19 00,00 4216,93
201005 TAFANI   0 00 01 01 037 19 00,00 4546,93
011341 GIL      0 00 01 01 037 19 00,00 4026,20
111222 CENTURIO 0 00 01 01 037 19 00,00 4176,20
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


El archivo es de ese estilo y lo que tengo que modificar es, por ejemplo, toda la columna que comienza por el 4216,93 por la que comienza por el 017.

Saludos
gustavobarra
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2011-05-13 14:44 @655

Re: Buscar y reemplazar palabra en txt

Notapor explorer » 2011-05-16 05:44 @280

Bien, pero...

¿se han de respetar los espacios en blanco o se pueden modificar?

¿las columnas deben siempre empezar en posiciones fijas?

¿Todas las líneas tienen datos? ¿No hay ninguna línea a quien le falte algún dato?

Cambiar 4216,93 por la que comienza por el 017 implica cambiar la décima columna por la séptima.

No estaría demás ver el resultado final.
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: Buscar y reemplazar palabra en txt

Notapor gustavobarra » 2011-05-16 05:56 @289

Las columnas siempre comienzan en la misma posición, todas las columnas tienen datos y en realidad el archivo posee unas 40 columnas donde hay que cambiar la 25 por la columna 8 donde las dos columnas poseen datos de números con decimales. Ej.: 4532,05 por 2359,00.
gustavobarra
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2011-05-13 14:44 @655

Re: Buscar y reemplazar palabra en txt

Notapor ileiva » 2011-05-16 08:35 @399

¿Son las dos únicas columnas con datos decimales?
Si no, ¿cuántas más son de ese estilo?
Avatar de Usuario
ileiva
Perlero nuevo
Perlero nuevo
 
Mensajes: 30
Registrado: 2011-04-23 03:25 @184
Ubicación: Santiago, Chile

Re: Buscar y reemplazar palabra en txt

Notapor explorer » 2011-05-16 09:16 @427

Bueno, ya tenemos una pista: las columnas empiezan siempre en la misma posición.

Entonces, una forma de resolverlo sería usando la función substr();

substr($linea, $posición_columna_25, $longitud_columna_25) = substr($linea, $posición_columna_8, $longitud_columna_8);
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


Volver a Básico

¿Quién está conectado?

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