• Publicidad

Extraer líneas

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

Extraer líneas

Notapor alexclipse » 2012-04-10 12:12 @550

«Desarrollar un programa que abra el archivo TEXTO1.rtf y cree uno nuevo de nombre pruebafin.txt, de tal forma que haga desaparecer todas las líneas que comiencen por “BASURA” y visualice el contenido por pantalla al mismo tiempo

El archivo TEXTO1.rtf contiene esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
ttcccatcaa gccctagggc tcctcgtggc tgctgggagt tgtagtctga acgcttctat
BASURA cttggcgaga agcgcctacg ctccccctac cgagtcccgc ggtaattctt aaagcacctg
caccgccccc ccgccgcctg cagagggcgc agcaggtctt gcacctcttc tgcatctcat
tctccaggct tcagacctgt ctccctcatt caaaaaatat ttattatcga gctcttactt
BASURA gctacccagc actgatatag gcactcagga atacaacaat gaataagata gtagaaaaat
tctatatcct cataaggctt acgtttccat gtactgaaag caatgaacaa ataaatctta
tcagagtgat aagggttgtg aaggagatta aataagatgg tgtgatataa agtatctggg
BASURA agaaaacgtt agggtgtgga tattacggaa agccttccta aaaaatgaca tttaactgat
tgggttccaa gggaacaggg tgg
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Para ir ensayando he hecho este programa:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $a = "texto1.rtf";
  2. my ($b1,$b2,$b3,$b4,$b5,$b6,$b7,$b8,$b9);
  3. open (FILEHANDLE, $a) || die "cannot open \"$infile\": $!";
  4. $b1=<FILEHANDLE>;
  5. print "$b1\n";
  6. $b2=<FILEHANDLE>;
  7. print "$b2\n";
  8. $b3=<FILEHANDLE>;
  9. print "$b3\n";
  10. $b4=<FILEHANDLE>;
  11. print "$b4\n";
  12. $b5=<FILEHANDLE>;
  13. print "$b5\n";
  14. $b6=<FILEHANDLE>;
  15. print "$b6\n";
  16. $b7=<FILEHANDLE>;
  17. print "$b7\n";
  18. $b8=<FILEHANDLE>;
  19. print "$b8\n";
  20. $b9=<FILEHANDLE>;
  21. print "$b9\n";
  22. close (FILEHANDLE);
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


El problema es que al ejecutarlo solo me devuelve con print() esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
ttcccatcaa gccctagggc tcctcgtggc tgctgggagt tgtagtctga acgcttctat
BASURA cttggcgaga agcgcctacg ctccccctac cgagtcccgc ggtaattctt aaagcacctg
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿Por qué no me imprime todas las líneas? He probado con 12 variables por si fuesen 12 líneas el programa pero tampoco me lo imprime todo.
Última edición por explorer el 2012-04-10 18:38 @818, editado 2 veces en total
Razón: Poner marcas Texto y Perl
alexclipse
Perlero nuevo
Perlero nuevo
 
Mensajes: 43
Registrado: 2012-03-27 11:17 @511

Publicidad

Re: Extraer líneas

Notapor explorer » 2012-04-10 13:42 @612

Lo he probado y sí me funciona. Mejor dicho: Funciona, pero mal,
ya que las líneas salen separadas con un línea en blanco. Esto
es debido a que les pones un carácter "\n" en los print(), que
se añade al que ya tienen.

Prueba con este:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. open my $FILE, '<', 'TEXTO1.rtf'
  7.   or die "ERROR: no pude abrir el archivo: $!\n";
  8.  
  9. my @archivo = <$FILE>;                            # Leemos todas las líneas
  10.  
  11. close $FILE;
  12.  
  13. for my $linea (@archivo) {                        # Para cada $linea del @archivo
  14.     print $linea;                                 # La sacamos en pantalla
  15. }
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: Extraer líneas

Notapor pedro19 » 2012-04-10 18:39 @819

¡Hola a todos!

Soy nuevo por aquí, he leído este tema porque mi desesperación me llevó a poner el mismo ejercicio en el buscador de Google.

He probado todas las formas que se me han ocurrido para poder solucionar el mismo, sin éxito.

El fichero "TEXTO1.rtf" incluye una serie de cadenas en unas 9 líneas y algunas de ellas aparecen introducidas por la palabra "BASURA".

He conseguido abrir el nuevo fichero "pruebafin.txt" e introducir aquí lo que contenía el fichero origen "TEXTO1.rtf". Sin embargo no sólo pasan al nuevo las cadenas, sino una gran cantidad de símbolos, letras y números que ocupan unas 160 líneas en mi nuevo documento.

Aparte de este problema (que no sé si realmente es un error o debería ser así) no consigo establecer una relación entre el nuevo fichero y la línea en la que aparece "BASURA" para que sea eliminada usando la expresión regular =~

Ahí va uno de mis decenas de intentos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my ($archivo1, $archivo2, $linea);
  2. my $archivo1 = "TEXTO1.rtf";
  3. my $archivo2 = "pruebafin.txt";
  4.  
  5.  
  6. open (FUENTE, $archivo1) or die "no puedo abrir el fichero \"$archivo1\": $!";
  7. open (RESULTADO, ">$archivo2") or die "no puedo abrir el fichero \"$archivo2\": $!";
  8.  
  9. while ($linea = <FUENTE>)
  10. {
  11. if (($archivo2 =~ /BASURA/))
  12.         {
  13.         $archivo2 -= $linea[/basura/];
  14.         print RESULTADO "$archivo2";
  15.         }
  16. else  {                      
  17.     print RESULTADO "$linea";                              
  18. }
  19. }
  20.  
  21.  
  22. close (FUENTE);
  23. close (RESULTADO);
  24.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Gracias de antemano al que se moleste en atenderme, pero lo agradecería muchísimo y me salvaría de un apuro.
¡¡Un saludo!! :)
pedro19
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2012-04-10 18:24 @808

Re: Extraer líneas

Notapor explorer » 2012-04-10 19:13 @842

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

Analicemos tu programa:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my ( $archivo1, $archivo2, $linea );              # declaras tres variables. Bien
  2. my $archivo1 = "TEXTO1.rtf";                      # declaras $archivo1 como... un momento... ¿no estaba declarada antes?
  3. my $archivo2 = "pruebafin.txt";                   # ¡ag! ¡Vuelves a declarar $archivo2!
  4.  
  5.                                                   # Abrimos los archivos. Bien
  6. open( FUENTE,    $archivo1 )    or die "no puedo abrir el fichero \"$archivo1\": $!";
  7. open( RESULTADO, ">$archivo2" ) or die "no puedo abrir el fichero \"$archivo2\": $!";
  8.  
  9. while ( $linea = <FUENTE> ) {                     # Para cada $linea de FUENTE...
  10.     if ( ( $archivo2 =~ /BASURA/ ) ) {            # Buscamos BASURA en el contenido de $archivo2
  11.                                                   # Un momento... pero si $archivo2 solo contiene "pruebafin.txt"
  12.                                                   # ¡FALLO! Además, te sobran un par de paréntesis
  13.  
  14.         $archivo2 -= $linea[/basura/];            # Glorioso... no sabemos lo que quieres hacer aquí ;)
  15.                                                   # Perl ve que quieres "restar" de $archivo2 el valor correspondiente
  16.                                                   # al índice /basura/ (que es una expresión regular)
  17.                                                   # del array @linea, que no ha sido definido en ninguna parte
  18.                                                   # Si tuvieras el "use warnings" activado, habría saltado el
  19.                                                   # ordenador en varios cachos
  20.         print RESULTADO "$archivo2";              # ¿¿¿Imprimes "pruebafin.txt" en sí mismo???
  21.     }
  22.     else {
  23.         print RESULTADO "$linea";                 # Aquí sobran las comillas, pero vale
  24.     }
  25. }
  26.  
  27. close(FUENTE);                                    # Cerramos los archivos. Bien.
  28. close(RESULTADO);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Aquí hay varios problemas...
  • No estás aplicando la expresión regular a la $linea, sino al $archivo2
  • Has intentando decirle a Perl que "saque" esa línea del archivo. Dicho así, yo sí te entiendo, pero Perl, no. Hay que decírselo de otra manera. Mejor dicho, la introducción del ejercicio ya te da una pista: Debes leer un archivo, obviar las líneas que tienen BASURA, y las que no, sacarlas al archivo de salida. Eso es usar un if(), que ya lo tienes. Te falta qué hacer en cada caso. O no hacer ;)

¡Animo! Tienes todos los elementos escritos. Solo tienes que cambiar un par de cosas y quitar una docena, y lo tendrás hecho.

En este mismo foro de Bioinformática tienes docenas de ejemplos que hacen eso mismo.
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: Extraer líneas

Notapor explorer » 2012-04-10 19:24 @850

A los dos, alexclipse y pedro19.

El archivo de partida se llama "texto1.rtf".

La extensión 'rtf' corresponde a los archivos Rich Text Format.

Eso quiere decir, que a lo mejor el contenido del archivo no es texto, sino que está codificado en RTF.

Si abrís el archivo en un editor de textos sencillo (por ejemplo el Bloc de Notas, si estáis en Windows), ¿qué sale?
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: Extraer líneas

Notapor pedro19 » 2012-04-11 05:55 @288

Literalmente sale lo mismo que en el nuevo archivo que creé.

Ahora estaba intentando solucionar el problema de eliminar las líneas que contengan la palabra "BASURA", para después ponerme a eliminar el resto de líneas que no me interesan...
Adjuntos
texto1.rtf
(30.53 KiB) 58 veces
pedro19
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2012-04-10 18:24 @808

Re: Extraer líneas

Notapor pedro19 » 2012-04-11 06:20 @305

Conseguí de una vez por todas eliminar las líneas con "BASURA".

Ahora debo eliminar el resto de líneas con esa retaíla de letras, signos y números.

Había pensado en marcar la primera secuencia y la última, de modo que sólo me imprima el fragmento que necesito, el problema es que estos caracteres también aparecen entrelazados entre las secuencias de bases... y además no sé muy bien donde introducir este if(), ni cómo decirle exactamente a Perl para que lo imprima en el nuevo archivo además de en la pantalla.

Gracias por la ayuda,explorer, ¡poco a poco!
pedro19
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2012-04-10 18:24 @808

Re: Extraer líneas

Notapor explorer » 2012-04-11 06:34 @315

El asunto es bastante más complejo de lo que parece.

El archivo, efectivamente, está en formato RTF. Todos esos códigos que ves demás corresponden a los estilos, fuentes de letras, y disposición del texto.

No es tan sencillo como abrir un archivo de texto y sacar las líneas que contienen la palabra BASURA... Antes tienes que distinguir qué es código RTF de lo que no es.

Por ejemplo, en la línea 49 del archivo aparece esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. \par \hich\af5\dbch\af31505\loch\f5 tctccaggct tcagacctgt ctccctcatt caaaaaa\hich\af5\dbch\af31505\loch\f5 tat ttattatcga gctcttactt
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Observa que se trata de parte de la secuencia genómica. Por delante está el código RTF de inicio de párrafo (\par) seguido del estilo a aplicar a ese párrafo. Más o menos, eso se puede quitar fácil. Pero además, fíjate que en medio de la secuencia genómica también aparece un cambio de estilo (\hich\af5\dbch\af31505\loch\f5 ), para el resto del párrafo.

El ejercicio dice que hay que sacar las líneas BASURA de dentro del archivo. En teoría, quiere decir que, si el archivo está en formato RTF, así debe quedar, por lo que no tendríamos que hacer nada más que filtrar los párrafos que contienen BASURA. El resultado seguirá siendo RTF.

Pero hay un problema mayor... la primera línea donde está la secuencia genómica es así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1. \fs22\lang3082\langfe3082\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp3082\langfenp3082 {\rtlch\fcs1 \af5\afs24 \ltrch\fcs0 \f5\fs24\insrsid798411 \hich\af5\dbch\af31505\loch\f5 ttcccatcaa gccctagggc tcctcgtggc tgctgggagt tgtagtctga acgcttctat
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
que no sigue el formato de las anteriores... Si la palabra BASURA apareciese ahí, y sacáramos toda la línea del archivo, tendríamos un problema grave de formato.

Entonces... necesitamos más pistas de lo que hay que hacer.

¿Cuál debe ser el resultado?
¿Un archivo de texto que solo contenga la secuencia genómica o un archivo que mantenega el formato RTF?
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: Extraer líneas

Notapor pedro19 » 2012-04-11 07:09 @340

Le he enviado un mensaje al profesor... Comunicaré la respuesta :)

El enunciado era este: "Desarrollar un programa que abra el archivo TEXTO1.rtf (disponéis de él en esta misma ubicación) y cree uno nuevo de nombre pruebafin.txt, de tal forma que haga desaparecer todas las líneas que comiencen por “BASURA” y visualice el contenido por pantalla al mismo tiempo."

A primera vista parece que no quiere que eliminemos la codificación ".rtf".
pedro19
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2012-04-10 18:24 @808

Re: Extraer líneas

Notapor pedro19 » 2012-04-11 07:14 @343

Ya recibí la respuesta.

Debemos editar manualmente el documento de partida "TEXTO1.rtf" de forma que lo convirtamos en "texto plano o limpio", y así mediante el programa generemos también uno nuevo ("pruebafin.txt") que también contenga "texto plano o limpio".

Ahora: ¿Cómo edito el documento de partida para convertirlo en "texto plano"?
pedro19
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2012-04-10 18:24 @808

Siguiente

Volver a Básico

¿Quién está conectado?

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