Vie Sep 26, 2008 4:45 pm
|
 |
lis
Perlero Nuevo

|
Registrado: 27 May 2008
Mensajes: 32
|
|
| Reemplazar palabras por número |
|
|
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... |
|
|
|

Vie Sep 26, 2008 5:28 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4239
Ubicación: Valladolid, España
|
|
|
|
|
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 |
|

Vie Sep 26, 2008 5:29 pm
|
 |
kidd
Creador de Perl en Español

|
Registrado: 15 Oct 2003
Mensajes: 1390
Ubicación: México
|
|
|
|
|
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 |
|
Sab Sep 27, 2008 7:20 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4239
Ubicación: Valladolid, España
|
|
|
|
|
Has dado en el clavo, Jenda. ESA es la solución perfecta para el foro Intermedio.
Enhorabuena. |
|
Sab Sep 27, 2008 4:24 pm
|
 |
lis
Perlero Nuevo

|
Registrado: 27 May 2008
Mensajes: 32
|
|
|
|
|
| Muchas gracias a todos por su útil y valioso aporte, estoy demasiado agradecida con todos ustedes. |
|
Mar Sep 30, 2008 1:17 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4239
Ubicación: Valladolid, España
|
|
|
|
|
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! |
|
Jue Oct 02, 2008 11:36 am
|
 |
natxo
Perlero Nuevo

|
Registrado: 09 Ago 2007
Mensajes: 26
Ubicación: Países Bajos
|
|
|
|
|
| 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). |
|
Jue Oct 02, 2008 12:30 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4239
Ubicación: Valladolid, España
|
|
|
|
|
| Es que en este caso, no es necesario usar expresiones regulares... Solo hay que cambiar "NaN" por "0 ". |
|
Jue Oct 02, 2008 1:09 pm
|
 |
Jenda
Perlero Frecuente

|
Registrado: 29 Oct 2007
Mensajes: 108
Ubicación: Praga, Republica Checa
|
|
|
|
|
| Sí que se puede hacer eso manualmente, en un editor. Pero si lo tienes que hacer con más archivos o cada día ... |
|
Powered by phpBB © 2001, 2005 phpBB Group
|