• Publicidad

Reemplazar palabras en un documento de texto

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

Reemplazar palabras en un documento de texto

Notapor Norther » 2008-01-31 09:15 @427

Lo que busco es abrir un documento de texto, buscar palabras que cumplan una determinada condición (estar tras "DESCRIPTION="), enviarlas a un traductor online, coger el resultado y en otro documento de texto poner el original pero con las palabras enviadas a traducir sustituidas por sus correspondientes traducciones, ya esta todo hecho menos la última parte...

¿Cómo puedo hacer para en ese documento de texto sustituir las palabras por las mencionadas?

Este es el código, ya sé que es horrible pero solo es un boceto. :P

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

use WWW::Mechanize; #Usando Mechanize

my $mech = WWW::Mechanize->new();
my $archivo;
my $url = 'http://world.altavista.com';

print "Introduce la ruta completa al .scp:\n";
chomp( $archivo = <STDIN> );

open( ARCH, "< $archivo" ) || die "Imposible abrir archivo, $!\n"; #Abrimos el archivo

while (<ARCH>) {  # Vamos leyendo linea a linea
        if ( $_ =~ /DESCRIPTION\W(.+)/gi ) { #Si en la linea se encuentra una palabra que cumpla el patron

                print "La palabra en ingles: $1\n"; # Sacamos esa palabra (esta en ingles)
               
                $mech->get($url);
                $mech->submit_form(
                        form_number => 1,
                        fields      => {
                                trtext => "$1",  # Aqui introducimos la palabra en el traductor online
                                lp     => 'en_es'
                        }
                );

                $wa = $mech->content;

                $wa =~ /<div style=padding:10px;>(.+)<\/div><\/td>/ig; # Extraemos la palabra de la respuesta..

                print "Y la misma traducida: $1\n\n"; # Y aqui en español tras extraerla de la respuesta del traductor online

        }
}
 
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Y un ejemplo de .txt como los que estoy tratando:

Código: Seleccionar todo
[ITEMDEF 01e34]
DEFNAME=i_scarecrow
RESOURCES=4 i_LOG, 14 i_STRAW, i_ROPE, i_hat_straw
WEIGHT=23
CATEGORY=Items by Professions
SUBSECTION=Farmer
DESCRIPTION=Scarecrow
DUPELIST=01e35

[ITEMDEF 01e35]
//scarecrow
DUPEITEM=01e34

[ITEMDEF 01e36]
DEFNAME=i_RUG_BEARSKIN_1
RESOURCES3=2 I_CORPSE_BEAR, 5 i_THREAD, 4 i_CANVAS
WEIGHT=20
//bearskin rug brown
CATEGORY=Decoration - Carpets & Rugs
SUBSECTION=Bearskin Carpet
DESCRIPTION=@
DUPELIST=01e37,01e38


Muchas gracias.
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Publicidad

Notapor explorer » 2008-01-31 10:04 @461

Casi lo tenías...
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use WWW::Mechanize;
use warnings;
use strict;

my $mech = WWW::Mechanize->new();
$mech->add_header('Accept-Charset' => 'utf-8');
my $url  = 'http://world.altavista.com';

print "Introduce la ruta completa al .scp:\n";
chomp( my $archivo = <STDIN> );

open( ARCH, "< $archivo" )
    or die "Imposible abrir archivo, $!\n";

while (<ARCH>) {
    if ( /DESCRIPTION=(.+)/i ) {
        #print "La palabra en ingles: $1\n";

        $mech->get($url);
        $mech->submit_form(
            form_number => 1,
            fields      => {
                trtext => $1,
                lp     => 'en_es'
            }
        );

        my $wa = $mech->content;
        (my $traducida) = $wa =~ /<div style=padding:10px;>(.+?)<\/div><\/td>/;

        #print "Y la misma traducida: $traducida\n\n";

        s/DESCRIPTION=.+/DESCRIPTION=$traducida/;
    }
    print;
}

close ARCH;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2008-02-01 12:36 @567, editado 1 vez en total
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

Notapor Norther » 2008-01-31 12:32 @563

Muchas gracias, me acabas de ahorrar un montón de rodeos porque mientras daba un paseo pensé en meterlo todo en un array y recorrerlo buscando la palabra para sustituirla con s/// :oops:
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Notapor Norther » 2008-01-31 15:28 @686

Estoy teniendo un pequeño problema, resulta que no había que sustituirlo, sino añadir debajo de DESCRIPTION=TAL campos tal que NAME2=en español, NAME3=en italiano, etc...

No me supuso ningún problema, hasta que me di cuenta de que no estaba funcionando. Con este código me imprime siempre la primera traducción que le pida; llegué a la conclusión de que era por que $mech->content; no cogía los nuevos contenidos cuando volvía a enviar el formulario, probé haciendo my $mech2 = WWW::Mechanize->new(); y poniendo un mech para cada envío, y de todo vamos, pero esto sigue igual, ya me quedé sin ideas la verdad...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

use WWW::Mechanize;
use warnings;
use strict;

my $mech = WWW::Mechanize->new();
my $url  = 'http://world.altavista.com';

print "Introduce la ruta completa al .scp:\n";
chomp( my $archivo = <STDIN> );

open( ARCH, "< $archivo" ) || die "Imposible abrir archivo, $!\n";

while (<ARCH>) {
    if ( /DESCRIPTION=(.+)/i ) {

        ### Al español ###
        $mech->get($url);
        $mech->submit_form(
            form_number => 1,
            fields      => {
                trtext => $1,
                lp     => 'en_es'
            }
        );

        my $wa = $mech->content;
        (my $traducidaesp) = $wa =~ /<div style=padding:10px;>(.+?)<\/div><\/td>/;
       
        print "$traducidaesp\n";        ### Esto devuelve "barril quebrado"

        ### Al Frances ###
$mech = WWW::Mechanize->new();
        $mech->get($url);
        $mech->submit_form(
            form_number => 1,
            fields      => {
                trtext => $1,
                lp     => 'en_fr'
            }
        );

        $wa = $mech->content;
        (my $traducidafr) = $wa =~ /<div style=padding:10px;>(.+?)<\/div><\/td>/;
       
        print "$traducidafr\n";      ### Este devuelve tambien barril quebrado *INCORRECTO*
        }
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Código: Seleccionar todo
[ITEMDEF 01db3]
DEFNAME=i_barrel_broken
RESOURCES=16 i_BOARD, 2 i_BARREL_HOOP, I_BARREL
WEIGHT=21
//broken barrel
CATEGORY=Decoration - Furniture
SUBSECTION=Broken Furniture
DESCRIPTION=Broken Barrel
DUPELIST=01db4,01db5,01db6



La salida de ejecutar esto es:

Barril Quebrado
Barril Quebrado


Y debería ser:

Barril Quebrado
Baril Cassu
(este en francés)

Ya no sé qué hacer. Como dije ya probé usando más de un $mech, usando distintas variables donde almacenar el content, y nada, parece que a partir de la primera petición ya no hay forma de vaciar el content...(también probé $mech->back;)

Muchas gracias.
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Notapor explorer » 2008-01-31 17:03 @752

El error está en la segunda ocasión que usas $1. Ya no contiene la palabra en inglés, sino la traducción al español, debido a la expresión regular que hay unas líneas más arriba.

Y claro, la traducción al francés de un texto español creyendo que es inglés, da el texto original en español.
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

Notapor Norther » 2008-01-31 17:17 @761

Voy a pegarme cabezazos contra la pared toda la noche y mañana te doy las gracias :S
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias


Volver a Básico

¿Quién está conectado?

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

cron