• Publicidad

Reemplazar palabras por número

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Reemplazar palabras por número

Notapor lis » 2008-09-26 17:45 @781

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...
lis
Perlero nuevo
Perlero nuevo
 
Mensajes: 106
Registrado: 2008-05-27 21:43 @946

Publicidad

Notapor explorer » 2008-09-26 18:28 @811

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
Última edición por explorer el 2008-09-26 18:35 @816, editado 1 vez en total
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

Notapor kidd » 2008-09-26 18:29 @812

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
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor Jenda » 2008-09-27 06:23 @307

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
-------------------------------------------------------
- Estoy aquí para practicar español. Si te ayudó mi respuesta ayudame con un mensaje privado sobre mis faltas por favor. Seguramente habrá muchas :-)
Jenda
Perlero nuevo
Perlero nuevo
 
Mensajes: 132
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa

Notapor explorer » 2008-09-27 08:20 @389

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

Enhorabuena.
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

Notapor lis » 2008-09-27 17:24 @767

Muchas gracias a todos por su útil y valioso aporte, estoy demasiado agradecida con todos ustedes.
lis
Perlero nuevo
Perlero nuevo
 
Mensajes: 106
Registrado: 2008-05-27 21:43 @946

Notapor explorer » 2008-09-30 14:17 @637

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

Notapor natxo » 2008-10-02 12:36 @567

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).
saludos,
Natxo Asenjo
natxo
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2007-08-09 16:22 @723
Ubicación: Países Bajos

Notapor explorer » 2008-10-02 13:30 @604

Es que en este caso, no es necesario usar expresiones regulares... Solo hay que cambiar "NaN" por "0 ".
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

Notapor Jenda » 2008-10-02 14:09 @631

Sí que se puede hacer eso manualmente, en un editor. Pero si lo tienes que hacer con más archivos o cada día ...
-------------------------------------------------------
- Estoy aquí para practicar español. Si te ayudó mi respuesta ayudame con un mensaje privado sobre mis faltas por favor. Seguramente habrá muchas :-)
Jenda
Perlero nuevo
Perlero nuevo
 
Mensajes: 132
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa


Volver a Intermedio

¿Quién está conectado?

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