Página 1 de 1

Reemplazar palabras por número

NotaPublicado: 2008-09-26 17:45 @781
por lis
Hola a todos, mi problema es el siguiente: tengo un archivo llamado enero.dat; donde no hay dato aparece un NaN (not a number), yo tengo que hacer gráficas con este archivo y el programa que utilizo no lo reconoce y tengo que reemplazarlos por 0 (ceros). Y son más de medio millón de datos y unos 50 mil corresponden a NaN y reemplazarlos uno por uno sería muy engorroso y demoroso. He hecho muchos script y no he podido reemplazar los NaN por ceros, por eso les pido una ayudita.

Acá les muestro un extracto del archivo enero.dat en donde salen algunos NaN:

Código: Seleccionar todo
2005  1  24  11  11.65  40.98  5.02  143.03  -1.118  745.4
2005  1  24  12  12.57  41.48  4.71  152.10  -0.135  745.5
2005  1  24  13  NaN    NaN    NaN  NaN      NaN     NaN
2005  1  24  14  15.26  27.96  2.33  187.83  -3.143  745.6


Y este es uno de los tantos scripts que he hecho:

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

open (DATOS, "<enero.dat");
open (ARCHIVOS, ">enero_cero.dat");

while($lineas=<DATOS>){
    chop($lineas);
    @datos=split(" ",$lineas);
    if ($datos eq NaN) {
        NaN == 0;
        print ARCHIVOS "@datos\n";
    }
}
close (DATOS);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Les agradezco cualquier tipo de ayuda y adiós...

NotaPublicado: 2008-09-26 18:28 @811
por explorer
El uso de 'use strict;' es primordial para los programadores que empiezan en Perl (y los que llevan más tiempo, también).

Si lo hubieras puesto, te darías cuenta de que la variable @datos es distinta de la de $datos. Son dos variables.

En cuanto al problema, es muy sencillo hacer un filtrado de los datos.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

while (<DATA>) {
    s/NaN/0  /g;

    print;
}

__DATA__
2005  1  24  11  11.65  40.98  5.02  143.03  -1.118  745.4
2005  1  24  12  12.57  41.48  4.71  152.10  -0.135  745.5
2005  1  24  13  NaN    NaN    NaN  NaN      NaN     NaN
2005  1  24  14  15.26  27.96  2.33  187.83  -3.143  745.6
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
He optado por sustituir los NaN por un cero y dos espacios en blanco, para que no varíe la longitud de la línea ni la posición de las columnas.
Código: Seleccionar todo
2005  1  24  11  11.65  40.98  5.02  143.03  -1.118  745.4
2005  1  24  12  12.57  41.48  4.71  152.10  -0.135  745.5
2005  1  24  13  0      0      0    0        0       0
2005  1  24  14  15.26  27.96  2.33  187.83  -3.143  745.6

NotaPublicado: 2008-09-26 18:29 @812
por kidd
Hola,

Usando expresiones regulares es muy sencillo hacer lo que quieres:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
open my $DATOS, '<', 'enero.dat' or die $!;
open my $ARCHIVOS, '>', 'enero_cero.dat' or die $!;

while(my $linea = <$DATOS>){
    chop($linea);

    #Reemplazamos los NaN por 0
    $linea =~ s/NaN/0  /g;

    print {$ARCHIVOS} $linea, "\n";
}

close ($ARCHIVOS);
close ($DATOS);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Saludos

NotaPublicado: 2008-09-27 06:23 @307
por Jenda
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
perl -pi.bak -e 's/NaN/0  /g' enero.dat
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Eso cambia los datos en enero.dat y deja un backup en enero.dat.bak.

o
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
perl -p -e 's/NaN/0  /g' enero.dat > enero_cero.dat
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

NotaPublicado: 2008-09-27 08:20 @389
por explorer
Has dado en el clavo, Jenda. ESA es la solución perfecta para el foro Intermedio.

Enhorabuena.

NotaPublicado: 2008-09-27 17:24 @767
por lis
Muchas gracias a todos por su útil y valioso aporte, estoy demasiado agradecida con todos ustedes.

NotaPublicado: 2008-09-30 14:17 @637
por explorer
Ahora que lo pienso... ¿Qué habría de malo en meter el fichero en un editor de textos y usar la opción de buscar y reemplazar?

¡ja!

NotaPublicado: 2008-10-02 12:36 @567
por natxo
explorer escribiste:Ahora que lo pienso... ¿Qué habría de malo en meter el fichero en un editor de textos y usar la opción de buscar y reemplazar?

¡ja!


Es lo que hago muchas veces. Ahora bien, necesitas un editor que sepa lo que son las expresiones regulares, con Notepad no vas a ningún lado. Mi favorito es vim (tanto en Linux como en Windows).

NotaPublicado: 2008-10-02 13:30 @604
por explorer
Es que en este caso, no es necesario usar expresiones regulares... Solo hay que cambiar "NaN" por "0 ".

NotaPublicado: 2008-10-02 14:09 @631
por Jenda
Sí que se puede hacer eso manualmente, en un editor. Pero si lo tienes que hacer con más archivos o cada día ...