• Publicidad

Separar texto por párrafos

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

Separar texto por párrafos

Notapor guillermelc » 2007-11-13 13:27 @602

Hola chicos/as
Lo primero de todos es agradeceros por adelantado la respuesta.
Mi duda es muy simple(el problema es que no se me da muy bien la programación)

Tengo un fichero de texto como por ejemplo este sencillo:
Código: Seleccionar todo
Hola a todos.Me llamo Guillermo.
Me gusta el cine.También la música & los videojuegos. Tengo 25 años.
Gracias.Saludos.


Quiero separar cada frase (por punto "." y también por "&" )

Quedándome:
Código: Seleccionar todo
Hola a todos.
Me llamo Guillermo.
Me gusta el cine.
etc etc

Éste es mi código (está en fase de pruebas, pero nada, no hay manera...)
Gracias de nuevo

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

open (F,'prueba.txt'); #||die "Error al abrir fichero $prueba:$!;
open (F2,'>pruebasalida.txt'); #||die "Error al abrir fichero $prueba:$!;
$linea ='';
while( <F> ){
        if ( /abc.*/)
        {
        printf $linea;
        printf F2 $linea if $linea;
        $linea= $_;
       
        }
       # elseif ( /claimed/ )
        #{
        #print F2 $linea if $linea;
        #$linea= '';
        #}
}


print F2 $linea if $linea;
close F;
close F2;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
guillermelc
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2007-11-13 12:33 @565

Publicidad

Notapor explorer » 2007-11-13 13:56 @622

Bienvenido a los foros de Perl en Español, guillermelc.

Veo que tu código lo has copiado de un ejemplo reciente, de otro hilo.

Lamentablemente, aunque muchas veces se puede resolver un problema con la estrategia de probar y fallar, no siempre resulta adecuada. Las posibilidades pueden ser astronómicas, antes de encontrar la respuesta.

Debes tener claro el problema y tener un poco de conocimiento del lenguaje que vas a usar.

Esto es como construir una casa: cuantas más formas distintas de ladrillos conozcas más rápidamente y bonita quedará terminada la casa.

¿Qué tal tu nivel de Perl?

¿Qué intentabas hacer con /abc./?

Para tu problema, yo usaría expresiones regulares. Lo resolvería así:
  1. Leemos todo el fichero en una variable escalar
  2. Del fichero leído, quitamos todos los finales de línea que contenga, pues no nos sirven
  3. Buscamos los caracteres que nos interesan (. y &) y los sustituimos por ellos mismos más un carácter fin de línea. Así tendremos las líneas partidas por esos caracteres
  4. Sacamos el fichero resultado
Vamos, en 10 líneas se puede resolver (utilizando Perl, claro).

Si te ves muy perdido, avísanos.
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

Notapor guillermelc » 2007-11-13 16:17 @720

Hola Explorer & Cia
Muchas gracias por el consejo, la verdad es que me esta sirviendo de mucho.

He construido un nuevo programa siguiendo tus pautas y he realizado uno que se parece bastante al que quiero conseguir.

Mi único problema es que "sólo" me cambia el primer "." por un retorno de carro y de los siguientes que tenga en una misma frase pasa olímpicamente.

Ejemplo:
Código: Seleccionar todo
Hola a todos.Me llamo Guillermo.Me gusta el cine.

Lo convierte a:
Código: Seleccionar todo
Hola a todos
Me llamo Guillermo.Me gusta el cine.


He probado con * etc etc y ya no sé si será un problema de mi bucle while...

Muchas gracias de nuevo.
En cuanto lo tenga resuelto lo cuelgo por si le es de ayuda a alguien.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
open (F,'prueba.txt');
open (F2,'>pruebasalida.txt');
 
        while( $linea =<F>)
        #en $linea voy a tener la primera linea del texto,luego la 2,la 3...
        {
        $linea =~ s/\./\n/;
        #cambio el caracter'.'que aparece en una linea alfanumerica por un retorno de carro
        printf F2 $linea if $linea;
        }

close (F);
close (F2);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
guillermelc
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2007-11-13 12:33 @565

Notapor explorer » 2007-11-13 17:42 @779

Te falta añadir la opción /g para que ese cambio lo haga a lo largo de toda la línea.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$linea =~ s/\./\n/g;
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

Notapor Norther » 2007-11-13 17:57 @789

explorer escribiste:Veo que tu código lo has copiado de un ejemplo reciente, de otro hilo.


Es justo lo que estaba pensando :P
Norther
Perlero nuevo
Perlero nuevo
 
Mensajes: 117
Registrado: 2007-07-24 13:47 @616
Ubicación: Asturias

Re: Separar texto por párrafos

Notapor Jenda » 2007-11-13 18:51 @827

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

open (F,'prueba.txt'); #||die "Error al abrir fichero $prueba:$!;
open (F2,'>pruebasalida.txt'); #||die "Error al abrir fichero $prueba:$!;
$linea ='';
while( <F> ){
        if ( /abc.*/)
        {
        printf $linea;
        printf F2 $linea if $linea;
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



¡Por favor, no uses printf() si no lo vas a necesitar! El primer parámetro de la función printf() es el formato. Algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
printf "El precio de %s es %.2f.\n", $cosa, $precio;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Prueba que pasa si haces algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $linea = "Dady dady da 10% datos ...";
printf $linea;
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Jenda
Jenda
Perlero nuevo
Perlero nuevo
 
Mensajes: 132
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa

Notapor guillermelc » 2007-11-15 12:06 @546

Hola a todos.

Bueno, pues como veis, al final con vuestra ayuda logré terminar esta primera práctica. (Vista así, ahora me parece muy fácil... jejeje)

Así que lo primero de todo es deciros... :D MUCHAS GRACIAS :D

Jenda, probé las diferencias existentes entre printf y print normal.

Es que como soy "principiante" creí que era lo mismo.

La modifiqué para que también sustituya caracteres especiales como ?:!, etc por "retornos de carro".

La cuelgo por si le sirve a alguien:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
open (F,'prueba.txt');
open (F2,'>pruebasalida.txt');
 
        while( $linea =<F>)
        #en $linea voy a tener la primera línea del texto,luego la 2,la 3...
        {
        $linea =~ s/[\.\!\?\:]/\n/g;
        #cambio el carácter los caracteres correspondientes que aparece en una linea alfanumérica             por un retorno de carro,para dividir los párrafos como me piden
        print F2 $linea if $linea;
        }

close (F);
close (F2);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¡¡¡Saludos!!!
guillermelc
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2007-11-13 12:33 @565


Volver a Básico

¿Quién está conectado?

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