Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Reemplazar palabras por número

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Vie Sep 26, 2008 4:45 pm
lis
Perlero Nuevo
Perlero Nuevo
Registrado: 27 May 2008
Mensajes: 32
Reemplazar palabras por número Responder citando

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:
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:

Perl:
#!/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);


Les agradezco cualquier tipo de ayuda y adiós...
Mensaje Vie Sep 26, 2008 5:28 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4239
Ubicación: Valladolid, España
Responder citando

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.

Perl:
#!/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
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:
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


Ultima edición por explorer el Vie Sep 26, 2008 5:35 pm, editado 1 vez
Mensaje Vie Sep 26, 2008 5:29 pm
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1390
Ubicación: México
Responder citando

Hola,

Usando expresiones regulares es muy sencillo hacer lo que quieres:

Perl:
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);


Saludos
Mensaje Sab Sep 27, 2008 5:23 am
Jenda
Perlero Frecuente
Perlero Frecuente
Registrado: 29 Oct 2007
Mensajes: 108
Ubicación: Praga, Republica Checa
Responder citando

bash:
perl -pi.bak -e 's/NaN/0  /g' enero.dat


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

o
bash:
perl -p -e 's/NaN/0  /g' enero.dat > enero_cero.dat
Mensaje Sab Sep 27, 2008 7:20 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4239
Ubicación: Valladolid, España
Responder citando

Has dado en el clavo, Jenda. ESA es la solución perfecta para el foro Intermedio.

Enhorabuena.
Mensaje Sab Sep 27, 2008 4:24 pm
lis
Perlero Nuevo
Perlero Nuevo
Registrado: 27 May 2008
Mensajes: 32
Responder citando

Muchas gracias a todos por su útil y valioso aporte, estoy demasiado agradecida con todos ustedes.
Mensaje Mar Sep 30, 2008 1:17 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4239
Ubicación: Valladolid, España
Responder citando

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!
Mensaje Jue Oct 02, 2008 11:36 am
natxo
Perlero Nuevo
Perlero Nuevo
Registrado: 09 Ago 2007
Mensajes: 26
Ubicación: Países Bajos
Responder citando

explorer escribió:
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).
Mensaje Jue Oct 02, 2008 12:30 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4239
Ubicación: Valladolid, España
Responder citando

Es que en este caso, no es necesario usar expresiones regulares... Solo hay que cambiar "NaN" por "0 ".
Mensaje Jue Oct 02, 2008 1:09 pm
Jenda
Perlero Frecuente
Perlero Frecuente
Registrado: 29 Oct 2007
Mensajes: 108
Ubicación: Praga, Republica Checa
Responder citando

Sí que se puede hacer eso manualmente, en un editor. Pero si lo tienes que hacer con más archivos o cada día ...
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group