Página 1 de 3

Acumulación de texto

NotaPublicado: 2012-05-11 12:54 @579
por gallinaclueca
Hola, estoy elaborando un programa que me separe una lista de bases nitrogenadas en codones (tríos de bases). Para ello he elaborado este código. El problema está en que el archivo 20 tiene todo lo que tienen los archivos anteriores más lo que le correspondería por sí mismo. ¿Cómo lo soluciono?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $contador = 0;
  2. @codon    = ();
  3. while ( $contador < 20 ) {
  4.     $contador += 1;
  5.     $espermatozoide = "espermatozoide$contador.txt";
  6.     open( FH,  "$espermatozoide" )        or die "No se puede abrir";
  7.     open( FH2, " > result$contador.txt" ) or die "No se puede abrir";
  8.     while ( $linea = <FH> ) {
  9.         $codon = substr( $linea, 0, 3 );
  10.         push( @codones, $codon );
  11.         print FH2 "@codones:";
  12.  
  13.     }
  14. }
  15. print "hecho";
  16. close(FH);
  17. close(FH2);
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4

Re: Acumulación de texto

NotaPublicado: 2012-05-11 17:32 @772
por explorer
Bienvenido a los foros de Perl en Español, gallinaclueca.

Hay algunas líneas que están fuera de onda...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $contador ( 1 .. 20 ) {
  2.     my $espermatozoide = 'espermatozoide' . $contador . '.txt';
  3.     my $resultado      = 'result'         . $contador . '.txt';
  4.  
  5.     my @codones;
  6.     open( FH, $espermatozoide )  or  die "No se puede abrir $espermetozoide: $!\n";
  7.     while ( my $linea = <FH> ) {
  8.         push @codones, substr( $linea, 0, 3 ):
  9.     }
  10.     close(FH);
  11.  
  12.     open( FH2, "> $resultado" )  or  die "No se puede abrir $resultado: $!\n";
  13.     print FH2 join ':', @codones;
  14.     close(FH2);
  15. }
  16.  
  17. print "Hecho";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Re: Acumulación de texto

NotaPublicado: 2012-05-14 11:35 @524
por gallinaclueca
Hola. Al ejecutar el programa que mandaste, los archivos result$contador ya no se van acumulando en el contenido, pero sólo salen dos líneas de letras (bases nitrogenadas) separadas de 3 en tres por medio de ":" cuando en los archivos espermatozoide$contador.txt había unas 20 líneas.

¿A qué se debe esta falta de contenido?

En caso de que haya que utilizar el texto acumulado, ¿habría alguna manera o comando de "restar textos acumulados" para obtener lo que tendría que haber en el archivo correspondiente?

Por ejemplo: a result4.txt le sustraemos el contenido de result3.txt en algún ciclo (ya que tenemos 20 archivos) para que quede lo que tendría que haber en result4.txt.

Muchas gracias.

Re: Acumulación de texto

NotaPublicado: 2012-05-14 11:44 @530
por explorer
Sin ver los archivos, es difícil saber qué pasa.

¿Puedes publicar uno de los archivos de espermatozoide, y luego, cómo debería quedar el result correspondiente?

La forma de "restar" contenido implica que haya que leer todos los archivos, meter la información en hash, y luego hacer las restas.

Re: Acumulación de texto

NotaPublicado: 2012-05-14 11:59 @541
por gallinaclueca
Bien, te publico los archivos espermatozoide1 y result1 que son los primeros que se graban y por tanto no hay acumulación de texto. El archivo result1 es correcto a excepción de que no imprime los ':' a excepción de en ciertos codones.

Re: Acumulación de texto

NotaPublicado: 2012-05-14 12:36 @566
por explorer
Creo que debes explicar exactamente qué quieres hacer... en qué consiste eso de la acumulación... porque no acabo de entender cómo de un archivo de 21Kb se puede generar otro de más de 350Kb...

Re: Acumulación de texto

NotaPublicado: 2012-05-14 12:38 @568
por gallinaclueca
No hay un solo archivo de 21 kb, hay 20. Y en el archivo 20 se imprime todo el contenido del 1, 2, 3, 4, etc hasta el 20 en lugar de solo el del 20 como le correspondería.

Re: Acumulación de texto

NotaPublicado: 2012-05-14 12:41 @570
por explorer
O sea... que no es necesario leer los 19 primeros espermatozoide, porque en el 20 está todo, ¿no?

Pues entonces solo tienes que procesar un archivo... el 20.

Re: Acumulación de texto

NotaPublicado: 2012-05-14 12:44 @572
por gallinaclueca
No me he explicado bien. En espermatozoide1 hay una serie de bases que quiero imprimir separadas de 3 en 3 en result 1. En espermatozoide2 hay otra serie que quiero imprimir en result2 y asi con todas.

Re: Acumulación de texto

NotaPublicado: 2012-05-14 12:55 @579
por explorer
¿Pero porqué sale tan grande result1?

Te pedí que result1 fuera la salida de espermatozoide1... Y ahora no sé qué formato es ese... salen parejas de codones separadas por espacios, unidas cada pareja por el ':'.

¿Qué formato debe tener result1?

Si espermatozoide1 tiene 422 líneas, según tu código, deben salir los 422 codones del comienzo de todas las líneas, unidos por ':'.

¿No es así?