• Publicidad

Sustituir en fichero números por string

Perl aplicado a la bioinformática

Sustituir en fichero números por string

Notapor samust » 2012-10-23 04:03 @210

Hola,

Tengo un problema al tratar un fichero. El fichero es del siguiente tipo:


Sintáxis: (cases.txt) [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
1234 1  2  3  1  1  2
1235 1  2  2  1  1  2
1232 2  1  2  3  2  2
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Todo esto separado por tabulaciones, y yo lo que quiero es leerlo y modificar esos números por un texto diferente para cada columna y valor. Es decir, para la columna 2 el valor 1 es Male y para la columna 3 el valor 1 es Present.

El problema lo tengo en que me sustituye cuando encuentra la primera ocurrencia del 1 que es en la primera columna y no sé cómo decirle que me sustituya sólo la de la 2.

El código de forma resumida es el siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @lineas;
  2. open FICHERO,, "<:utf8", "cases.txt" or die 'No se puede abrir el fichero cases.txt !';
  3. @lineas = <FICHERO>;
  4. close FICHERO;
  5.  
  6. for ( $j = 0; $j <= $#lineas; $j = $j + 1 ) {
  7.  
  8.     @valores = split( "\t", $lineas[$j] );
  9.     $entra = 0;
  10.  
  11.     # SEX
  12.     if ( $valores[3] eq "1" ) {
  13.         $b = $valores[3];
  14.         $c = "Male";
  15.         $lineas[$j] =~ s/$b/$c/;
  16.         push @aux, $lineas[$j];
  17.         $entra = 1;
  18.     }
  19.     elsif ( $valores[3] eq "2" ) {
  20.         $b = $valores[3];
  21.         $valores[3] = "Female";
  22.         $lineas[$j] =~ s/$b/$c/;
  23.         push @aux, $lineas[$j];
  24.         $entra = 1;
  25.     }
  26.  
  27.     # moonths ill
  28.     if ( $valores[37] eq "0" ) {
  29.         $b = $valores[37];
  30.         $c = "Absent";
  31.         $lineas[$j] =~ s/$b/$c/;
  32.         push @aux, $lineas[$j];
  33.         $entra = 1;
  34.     }
  35.     elsif ( $valores[37] eq "1" ) {
  36.         $b = $valores[37];
  37.         $c = "Present";
  38.         $lineas[$j] =~ s/$b/$c/;
  39.         push @aux, $lineas[$j];
  40.         $entra = 1;
  41.     }
  42.     elsif ( $valores[37] eq "3" ) {
  43.         $b = $valores[37];
  44.         $c = "?";
  45.         $lineas[$j] =~ s/$b/$c/;
  46.         push @aux, $lineas[$j];
  47.         $entra = 1;
  48.     }
  49.     elsif ( $valores[37] eq "2" ) {
  50.         $b = $valores[37];
  51.         $c = "Suspected";
  52.         $lineas[$j] =~ s/$b/$c/;
  53.         push @aux, $lineas[$j];
  54.         $entra = 1;
  55.     }
  56.     if ( !$entra ) {
  57.         push @aux, $lineas[$j];
  58.     }
  59. }
  60.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Hago el push @aux, porque quiero guardar en un fichero el resultado, tanto las columnas que cambio como las que no.

Muchas gracias de antemano y espero haberme explicado bien,
saludos. :D
Última edición por explorer el 2012-10-23 08:00 @375, editado 2 veces en total
Razón: Formateado de código con Perltidy
samust
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2012-10-23 03:50 @201

Publicidad

Re: Sustituir en fichero números por string

Notapor explorer » 2012-10-23 09:38 @443

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

Esta es una manera, parecida a la que has publicado:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. ## Lectura
  7. open FICHERO, '<:utf8', "cases.txt" or die "No se puede abrir el archivo cases.txt: $!\n";
  8. my @lineas;
  9. while (my $linea = <FICHERO>) {
  10.     chomp $linea;
  11.    
  12.     my @columnas = split " ", $linea;
  13.    
  14.     push @lineas, [ @columnas ];                # creamos una estructura bidimensional
  15. }
  16. close FICHERO;
  17.  
  18. ## Proceso
  19. for my $linea (@lineas) {
  20.     my @columnas = @$linea;
  21.    
  22.     if ($columnas[1] == 1) {
  23.         $columnas[1] = 'Male';
  24.     }
  25.     elsif ($columnas[1] == 2) {
  26.            $columnas[1] = 'Female';
  27.     }
  28.    
  29.     if ($columnas[2] == 0) {
  30.         $columnas[2] = 'Absent';
  31.     }
  32.     elsif ($columnas[2] == 1) {
  33.            $columnas[2] = 'Present';
  34.     }
  35.     elsif ($columnas[2] == 2) {
  36.            $columnas[2] = 'Suspected';
  37.     }
  38.     elsif ($columnas[3] == 3) {
  39.            $columnas[3] = '?';
  40.     }    
  41.  
  42.     $linea = [ @columnas ];
  43. }
  44.  
  45. ## Escritura
  46. open FICHERO, '>:utf8', "cases_1.txt" or die "No se puede escribir en el archivo cases_1.txt: $!\n";
  47. for my $linea (@lineas) {
  48.     print FICHERO join("\t", @$linea), "\n";
  49. }
  50. close FICHERO;
  51.  
  52. __END__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Pero con un poco de ayuda, se puede abreviar:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use v5.14;
  3. use autodie;
  4.  
  5. ## Transformaciones
  6. # Es un hash de hashes. La primera clave es el número de columna,
  7. # y su hash correspondiente indica la transformación a realizar
  8. my %trans = (
  9.     1   => {
  10.             1 => 'Male',
  11.             2 => 'Female',
  12.     },
  13.     2   => {
  14.             0 => 'Absent',
  15.             1 => 'Present',
  16.             2 => 'Suspected',
  17.             3 => '?',
  18.     },
  19. );
  20.  
  21. ## Lectura/procesado/escritura, línea a línea
  22. open my $ENTRADA, '<:utf8', "cases.txt";
  23. open my $SALIDA , '>:utf8', "cases_1.txt";
  24.  
  25. while (my $linea = <$ENTRADA>) {
  26.     chomp $linea;
  27.    
  28.     my @columnas = split " ", $linea;
  29.  
  30.     for my $columna (keys %trans) {
  31.         $columnas[$columna] = $trans{$columna}{$columnas[$columna]};    # La magia
  32.     }
  33.  
  34.     say $SALIDA join "\t", @columnas;
  35. }
  36.  
  37. close $ENTRADA;
  38. close $SALIDA;
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: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Sustituir en fichero números por string

Notapor samust » 2012-10-24 04:01 @209

Muchísimas gracias, creo que me voy a decantar por la segunda opción, es más elegante y eficiente creo :D .
samust
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2012-10-23 03:50 @201


Volver a Bioinformática

¿Quién está conectado?

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