• Publicidad

Al descargar reemplazar espacios vacíos por NaN

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Al descargar reemplazar espacios vacíos por NaN

Notapor lis » 2009-10-21 13:47 @616

Hola amigos del foro, tengo el siguiente script que me descarga datos meteorológicos de altura de la siguiente forma:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
807    115
    88  16959  -77.5                         335     13  392.2         392.2
    86  17108  -77.1                         330     16  395.1         395.1
    78  17849  -75.3                          25      3  410.1         410.1
    74  18248  -74.3                         130     12  418.3         418.3
    71  18562  -73.6                         115     26  424.9         424.9
    70  18670  -73.3                         125     23  427.2         427.2
    66  19020  -72.4                         130     21  436.4         436.4
    63  19296  -71.7                         105     15  443.8         443.8
    61  19488  -71.2                          70     16  448.9         448.9
    55  20103  -69.7                          70     36  465.9         465.9
    50  20670  -68.3  -89.3      4   0.00     80     27  482.1  482.1  482.1
    49  20828  -67.1  -88.1      4   0.00     74     32  488.6  488.6  488.6
    48  20915  -67.6  -88.6      4   0.00     70     34  489.5  489.5  489.5
    45  21249  -69.5  -90.5      3   0.00     57     26  492.7  492.7  492.7
    43  21580  -67.5  -89.2      3   0.00     45     18  505.3  505.3  505.3
    42  21724  -66.7  -88.6      3   0.00     50     14  510.8  510.9  510.8
    40  22021  -64.9  -87.4      3   0.00     95     10  522.5  522.5  522.5
    39  22175  -63.9  -86.8      3   0.01    120     15  528.6  528.6  528.6
    37  22496  -62.0  -85.5      3   0.01     85     26  541.5  541.6  541.5
    35  22783  -60.3  -84.3      3   0.01    106     21  553.3  553.4  553.4
    35  22836  -60.5  -84.5      3   0.01    110     20  554.3  554.4  554.3
    34  23015  -61.0  -85.0      3   0.01     95     18  557.5  557.6  557.5
    32  23391  -62.0  -86.0      3   0.01     95     35  564.4  564.5  564.4
    31  23548  -62.5  -86.5      3   0.01     93     32  567.3  567.4  567.3
    30  23790  -62.3  -86.3      3   0.01     90     28  574.2  574.3  574.2
    29  24001  -59.4  -86.1      2   0.01     85     28  587.8  587.9  587.8
    29  24022  -59.1  -86.1      2   0.01                589.2  589.3  589.2
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Y como pueden ver hay espacios en blanco; eso indica que el aparato no registra datos.

El problema está en que el script que me descarga esto, esos espacios los rellena con ceros, y lo que quiero es que en vez de ceros los rellene con NaN (Not a Number), y necesito que haga eso porque al momento de procesar esos datos vacíos los toma en cuenta, siendo que no hay datos.

Bueno mis amigos, aquí les dejo el script, porque le hecho modificaciones y no consigo lo que necesito.

Muchas gracias de antemano a todos por sus aportes.

Aquí está el script:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. #use warnings;
  4. #use strict;
  5. use LWP::Simple;
  6.  
  7. my $URL= 'http://weather.uwyo.edu/cgi-bin/sounding?region=samer&TYPE=TEXT%3ALIST&YEAR=';
  8. my $url = '&STNM=85442';
  9.  
  10. for my $ano  ( 2005 ) {
  11. for my $mes  ( "03" ) {
  12. for my $dia  ( "01" .. "31" ) {
  13. for my $hora (  12  ) {
  14.  
  15. my $fecha   = "$ano-$mes-$dia".".dat";
  16. my $pagina  = get("$URL$ano&MONTH=$mes&FROM=$dia$hora&TO=$dia$hora$url");
  17.  
  18. if (defined $pagina) {
  19. if ((my $datos) = $pagina =~ m/^<PRE>(.+?)<\/PRE>/sim) {
  20.  
  21. open (FICHERO, ">$fecha");
  22.  
  23. for my $linea (split "\n", $datos) {
  24. next if $linea !~ /^\s*\d/; # Nos quedamos solo con los datos de la tabla
  25.  
  26. my $pres = substr $linea, 0, 7;
  27. my $hght = substr $linea, 8, 14;
  28. my $temp = substr $linea, 15, 6;
  29. my $dwpt = substr $linea, 22, 6;
  30. my $relh = substr $linea, 29, 6;
  31. my $mixr = substr $linea, 36, 6;
  32. my $drct = substr $linea, 43, 6;
  33. my $sknt = substr $linea, 50, 6;
  34. my $thta = substr $linea, 57, 6;
  35. my $thte = substr $linea, 64, 6;
  36. my $thtv = substr $linea, 71, 6;
  37.  
  38. printf FICHERO "%6.0f %6.0f %6.1f %6.1f %6.0f %6.2f %6.0f %6.0f %6.1f %6.1f %6.1f\n", $pres, $hght, $temp, $dwpt, $relh, $mixr, $drct, $sknt, $thta, $thte, $thtv;
  39. }
  40. close (FICHERO);
  41. }}}}}}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
lis
Perlero nuevo
Perlero nuevo
 
Mensajes: 106
Registrado: 2008-05-27 21:43 @946

Publicidad

Re: Al descargar reemplazar espacios vacíos por NaN

Notapor explorer » 2009-10-22 14:28 @644

Este problema (y la misma URL) ya fue respondida en otras dos ocasiones, pero ya no soy capaz de encontrarlas en el histórico del foro.

Así que toca rehacer la respuesta :)

Primero, hay que ver exactamente de qué estamos hablando. Los datos que leemos y filtramos tienen este aspecto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
-----------------------------------------------------------------------------
   PRES   HGHT   TEMP   DWPT   RELH   MIXR   DRCT   SKNT   THTA   THTE   THTV
    hPa     m      C      C      %    g/kg    deg   knot     K      K      K
-----------------------------------------------------------------------------
 1003.0    115   18.4   15.8     85  11.38    150      3  291.3  323.6  293.3
 1002.0    124   18.2   12.2     68   8.98    152      3  291.2  316.9  292.8
 1000.0    142   17.8   11.8     68   8.76    155      4  290.9  316.0  292.5
  977.0    339   16.1   11.1     72   8.55    195     11  291.2  315.7  292.7
  967.0    427   15.4   10.8     74   8.46    195     14  291.3  315.6  292.8
  925.0    803   12.2    9.4     83   8.06    200      9  291.8  315.0  293.2
  124.0  15363  -71.9  -91.3      4   0.00    294     40  365.4  365.4  365.4
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

donde algunos de los valores puede estar en blanco. En ese caso, hay que sustituirlos por 'NaN'.

El problema con este tipo de problemas es que no podemos usar la función split(), ya que pueden faltar valores y se nos descuadra la información (no sabríamos qué valor del arreglo devuelto por split() corresponde a qué columna).

Así que hay que romper las líneas de otra manera. Lo normal es extraer una de las líneas y agregar algo de ASCII-ART para saber dónde empiezan y acaban las columnas. Tomamos la primera línea y empezamos a dibujar:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
 1003.0    115   18.4   15.8     85  11.38    150      3  291.3  323.6  293.3
012345678901234567890123456789012345678901234567890123456789012345678901234567890
          1         2         3         4         5         6         7         8
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Así es fácil saber dónde empieza y acaba cada una. La mayoría de los editores de texto informan de la columna donde está el cursor, así que no haría falta hacer esto. Otros, como el Notepad++ tienen una regla horizontal, para operaciones parecidas.

Y de resultas de ver la primera línea, observamos que, por fortuna, todos los campos tienen exactamente 7 caracteres:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
          1         2         3         4         5         6         7         8 012345678901234567890123456789012345678901234567890123456789012345678901234567890
 1003.0    115   18.4   15.8     85  11.38    150      3  291.3  323.6  293.3
 123456 123456 123456 123456 123456 123456 123456 123456 123456 123456 123456
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Así que la extracción es aún más sencilla. Con una línea como
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    my @valores = unpack('(A7)*', $linea);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

ya tenemos leídos todos los valores de los campos.

Y ahora, solo quedaría hacer la transformación de los campos vacíos a 'Nan'. Pues dicho y hecho:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
for my $valor (@valores) {
    $valor = '    NaN' if $valor =~ /^\s*$/;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Para el que no lo vea claro: la variable $valor está haciendo de alias de cada uno de los valores de @valores, por lo que modificarla es lo mismo que modificar los valores del arreglo.

Solo quedaría sacarlos al fichero:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $fmt_salida = "%6.0f %6.0f %6.1f %6.1f %6.0f %6.2f %6.0f %6.0f %6.1f %6.1f %6.1f\n";
printf $fmt_salida, @valores;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Ahora bien, estamos sacando valores todos numéricos. ¿Qué hara printf() cuando se encuentre con un valor 'NaN'? Pues esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
    18  27134  -46.7  -81.7      1   0.03    nan    nan  713.6  713.9  713.6
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Bueno, si en vez de 'NaN' nos vale 'nan' (en minúsculas), pues entonces el problema se daría por terminado.

El programa quedaría así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4.  
  5. use LWP::Simple;
  6.  
  7. # Formato de salida
  8. my $fmt_salida = "%6.0f %6.0f %6.1f %6.1f %6.0f %6.2f %6.0f %6.0f %6.1f %6.1f %6.1f\n";
  9.  
  10. # Bucle por todos los datos
  11. for my $ano  ( 2005         ) {
  12. for my $mes  ( "03"         ) {
  13. for my $dia  ( "01" .. "31" ) {
  14. for my $hora (  12          ) {
  15.  
  16.     my $pagina = get(
  17.          'http://weather.uwyo.edu/cgi-bin/sounding?'
  18.        . join '&'
  19.          ,   'region=samer'
  20.          ,   'TYPE=TEXT%3ALIST'
  21.          ,   "YEAR=$ano"
  22.          ,   "MONTH=$mes"
  23.          ,   "FROM=$dia$hora"
  24.          ,   "TO=$dia$hora"
  25.          ,   'STNM=85442'
  26.     );
  27.  
  28.     if (defined $pagina) {
  29.         if ((my $datos) = $pagina =~ m/^<PRE>(.+?)<\/PRE>/sim) {
  30.  
  31.             open  FICHERO, ">$ano-$mes-$dia.dat";
  32.  
  33.             for my $linea (split "\n", $datos) {
  34.                 next if $linea !~ /\d/;        # Solo nos interesan las líneas con números
  35.  
  36.                 chomp $linea;
  37.  
  38.                 my @valores = unpack('(A7)*', $linea);
  39.  
  40.                 for my $valor (@valores) {
  41.                     $valor = '    NaN'
  42.                         if $valor =~ /^\s*$/;
  43.                 }
  44.  
  45.                 printf FICHERO $fmt_salida, @valores;
  46.             }
  47.  
  48.             close FICHERO;
  49.         }
  50.     }
  51. }}}}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Ahora bien... ¿qué ocurre si un día cambian los datos de entrada? Pues que tenemos que reeditar el programa.

Una de las características de los buenos programas es su fortaleza frente a los cambios.

En el problema que nos ocupa, vamos a fijarnos en las primeras líneas de los datos de entrada:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
-----------------------------------------------------------------------------
   PRES   HGHT   TEMP   DWPT   RELH   MIXR   DRCT   SKNT   THTA   THTE   THTV
    hPa     m      C      C      %    g/kg    deg   knot     K      K      K
-----------------------------------------------------------------------------
 1003.0    115   18.4   15.8     85  11.38    150      3  291.3  323.6  293.3
 1002.0    124   18.2   12.2     68   8.98    152      3  291.2  316.9  292.8
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Vemos algo interesante:
* los titulares de las columnas están escritos en mayúsculas, mientras que la línea de unidades contienen, sobre todo minúsculas
* esos mismos titulares están alineados, a la derecha, en su respectiva columna.

Es decir: la línea de titulares nos dice:
* cuántas columnas hay
* cómo se llaman
* dónde empiezan y terminan cada una de ellas

Sospechamos que, en el futuro, si hay algún cambio, tanto en el número de columnas, como en su disposición, la línea de titulares nos puede chivar cómo están organizados los datos.

Así que tenemos que hacer dos cosas: saber dónde comienzan y terminan las columnas y cómo ha de ser la salida.

En cuanto a lo segundo tenemos un nuevo problema: no sabemos a priori, con sólo los datos de entrada, cómo es la salida que tenemos que generar. Por eso estamos obligados a hacerlo nosotros mismos a mano:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @fmt_salida = qw(
    %6.0f
    %6.0f
    %6.1f
    %6.1f
    %6.0f
    %6.2f
    %6.0f
    %6.0f
    %6.1f
    %6.1f
    %6.1f
);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Lo que sí nos servirán estos valores es para luego poder formatear correctamente la salida del texto 'NaN'.

Sólo queda averiguar dónde está cada columna. Para ello, usaremos una expresión regular que recorra la línea de titulares y nos vaya guardando en un bucle el ancho de cada una.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
                if ($linea =~ /[A-Z]/) {                            # Si estamos en la línea de titulares...

                    my $columna_anterior = 0;                       # Índice a la columna del campo anterior

                    while ($linea =~ /\w+/g) {                      # Vamos buscando cada título
                        push @columnas, pos($linea) - $columna_anterior;    # Guardamos el ancho de cada columna
                        $columna_anterior = pos($linea);
                    }
                    $columnas = join '', map { "A$_" } @columnas;   # Formato de la línea
                }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Usamos la función pos() para saber la posición dentro de la $linea la posición de final de la columna. Ahora ya tenemos en $formato_columnas el formato de la línea de datos, que tendrá un aspecto parecido a este: 'A7A7A7A7A7A7A7A7A7A7A7', que es del tipo de formato especial para la función unpack().

El programa queda así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4.  
  5. use LWP::Simple;
  6.  
  7. # Formato de salida. Almacena la forma de salida de cada campo
  8. my @fmt_salida = qw(
  9.     %6.0f
  10.     %6.0f
  11.     %6.1f
  12.     %6.1f
  13.     %6.0f
  14.     %6.2f
  15.     %6.0f
  16.     %6.0f
  17.     %6.1f
  18.     %6.1f
  19.     %6.1f
  20. );
  21.  
  22. # Bucle por todos los datos
  23. for my $ano  ( 2005         ) {
  24. for my $mes  ( "03"         ) {
  25. for my $dia  ( "01" .. "31" ) {
  26. for my $hora (  12          ) {
  27.  
  28.     my $pagina = get(
  29.          'http://weather.uwyo.edu/cgi-bin/sounding?'
  30.        . join '&'
  31.          ,   'region=samer'
  32.          ,   'TYPE=TEXT%3ALIST'
  33.          ,   "YEAR=$ano"
  34.          ,   "MONTH=$mes"
  35.          ,   "FROM=$dia$hora"
  36.          ,   "TO=$dia$hora"
  37.          ,   'STNM=85442'
  38.     );
  39.  
  40.     if (defined $pagina) {
  41.  
  42.         if ((my $datos) = $pagina =~ m/^<PRE>(.+?)<\/PRE>/sim) {
  43.  
  44.             my @titulares;
  45.  
  46.             open  FICHERO, ">$ano-$mes-$dia.dat";
  47.  
  48.             my $formato_columnas;
  49.  
  50.             for my $linea (split "\n", $datos) {
  51.                 chomp $linea;
  52.  
  53.                 next if $linea =~ /^--+/;                           # Obviamos las líneas con guiones
  54.                 next if $linea =~ /[a-z]/;                          # Obviamos las líneas con minúsculas
  55.  
  56.                 if ($linea =~ /[A-Z]/) {                            # Si estamos en la línea de titulares...
  57.  
  58.                     my $columna_anterior = 0;                       # Índice a la columna del campo anterior
  59.  
  60.                     my @columnas;
  61.                     while ($linea =~ /\w+/g) {                      # Vamos buscando cada título
  62.                         push @columnas, pos($linea) - $columna_anterior;    # Guardamos el ancho de cada
  63.                         $columna_anterior = pos($linea);
  64.                     }
  65.  
  66.                     $formato_columnas = join '', map { "A$_" } @columnas;   # Formato de la línea
  67.                 }
  68.                 elsif ($linea =~ /\d/) {                            # Aquí es una línea normal
  69.  
  70.                     my @valores = unpack($formato_columnas, $linea);
  71.  
  72.                     # Preparando la salida
  73.                     # Tenemos que recorrer los valores, para poner los valores NaN y además, crear el formato de salida
  74.                     my @formatos_salida;
  75.                     for(my $i = 0; $i < @valores; $i++) {
  76.                         my $valor = $valores[$i];                       # Valor de la columna
  77.                         my $fmt   = $fmt_salida[$i];                    # Formato con el que debe salir por defecto
  78.  
  79.                         if ($valor =~ /^\s*$/) {                        # Campo vacío
  80.  
  81.                             my ($ancho) = $fmt_salida[$i] =~ m/(\d+)/;  # Leemos del formato la cifra del tamaño del campo
  82.  
  83.                             $fmt = '%' . $ancho . 's';                  # Creamos el nuevo formato para sprintf()
  84.  
  85.                             $valores[$i] = sprintf $fmt, 'NaN';         # Colocamos el 'NaN' formateado a la derecha
  86.                         }
  87.  
  88.                         push @formatos_salida, $fmt;                    # Guardamos el formato
  89.                     }
  90.  
  91.                     my $fmt_salida = join(' ', @formatos_salida) . "\n";
  92.  
  93.                     printf FICHERO $fmt_salida, @valores;
  94.  
  95.                 }
  96.  
  97.             }
  98.  
  99.             close FICHERO;
  100.         }
  101.     }
  102. }}}}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Y ya tenemos la solución perfecta (¡esperemos!).

Falta comentar el jaleo de líneas que prepara la salida.

Lo que hacemos es recorrer todos los @valores de las columnas junto con el formato que esperamos, por defecto, usar para sacarle. Miramos a continuación si ese $valor es un blanco o vacío. Si es así, extraemos el $ancho del campo de salida del primer valor decimal del formato. Ejemplo: si el formato es '%6.2f' entonces de ahí extraemos el '6'.

Modificamos a continuación el formato de salida, para pasar de, por ejemplo, '%6.2f' a '%6s'. Y guardamos como nuevo valor de columna el valor de 'NaN' formateado a ese $ancho.

Finalmente, para sacar la línea entera al fichero de salida, creamos un formato de salida para un printf() consistente en la unión (join()) de todos los formatos y le aplicamos a él todos los @valores de las columnas.

Una salida típica ya es como la que queremos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
   380   7934  -17.2  -40.3     12   0.30    300     36  337.4  338.6  337.4
   375   8033  -17.7  -38.7     14   0.36    301     35  338.1  339.5  338.1
   339   8765  -24.3  -39.0     24   0.39    310     31  339.0  340.5  339.1
   300   9650  -32.3  -39.3     50   0.42    315     33  339.7  341.4  339.8
   287   9961  -35.1  -40.1     60   0.41    319     36  340.1  341.7  340.1
   269  10406  -38.5  -44.4     53   0.27    325     41  341.5  342.6  341.6
   250  10910  -42.3  -49.3     46   0.17    320     45  343.0  343.8  343.1
   230  11471  -44.9  -59.9     17   0.05    318     53  347.4  347.6  347.4
   208  12132  -50.2  -64.5     17   0.03    315     62  349.1  349.3  349.1
   200  12390  -52.3  -66.3     17   0.03    315     58  349.8  349.9  349.8
   180  13061  -58.0  -72.8     13   0.01    300     49  351.1  351.1  351.1
   174  13277  -59.9  -74.9     12   0.01    303     47  351.5  351.5  351.5
   151  14150  -67.1  -81.1     12   0.00    314     37  353.6  353.6  353.6
   150  14190  -67.1  -81.1     12   0.00    315     37  354.3  354.3  354.3
   140  14594  -69.8    NaN    NaN    NaN    325     40  356.7    NaN  356.7
   129  15073  -72.9    NaN    NaN    NaN    295     35  359.4    NaN  359.4
   110  16006  -79.1    NaN    NaN    NaN    300     27  364.6    NaN  364.6
   106  16217  -78.3    NaN    NaN    NaN    300     27  369.9    NaN  369.9
   100  16550  -77.1    NaN    NaN    NaN    245     21  378.5    NaN  378.5
    95  16840  -78.7    NaN    NaN    NaN    180      5  380.9    NaN  380.9
    94  16900  -79.0    NaN    NaN    NaN    160      4  381.4    NaN  381.4
    90  17146  -80.4    NaN    NaN    NaN     30     11  383.5    NaN  383.5
    87  17338  -81.5    NaN    NaN    NaN     20     15  385.1    NaN  385.1
    86  17377  -81.7    NaN    NaN    NaN      0     14  385.4    NaN  385.4
    85  17470  -81.3    NaN    NaN    NaN    330     15  388.0    NaN  388.0
    82  17674  -80.5    NaN    NaN    NaN    315     23  393.7    NaN  393.7
    78  17957  -79.3    NaN    NaN    NaN    230      5  401.9    NaN  401.9
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


(Observar que los valores 0 se respetan)
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: Al descargar reemplazar espacios vacíos por NaN

Notapor lis » 2009-12-21 13:11 @591

Hola amigos del foro.

Primero quiero dar las gracias, sobre todo a Explorer, por ayudarme.

Tengo este código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. #use warnings;
  4. #use strict;
  5. use LWP::Simple;
  6.  
  7. my $URL= 'http://weather.uwyo.edu/cgi-bin/sounding?region=samer&TYPE=TEXT%3ALIST&YEAR=';
  8. my $url = '&STNM=85442';
  9. my $GRD2RAD = (3.141592654 / 180);
  10. my $convertir = 0.514444;
  11.  
  12. for my $ano  ( 2007 ) {
  13. for my $mes  ( 8 ) {
  14. #for my $dia  ( 1 .. 31 ) {
  15. for my $dia  ( 5 ) {
  16. for my $hora (  12  ) {
  17.  
  18. my $FECHA  = "%04d%02d%02d";
  19. my $Fecha = sprintf $FECHA, $ano, $mes, $dia;
  20.  
  21. my $fecha   = $Fecha . '_sonda_cmoreno';
  22. my $pagina  = get("$URL$ano&MONTH=$mes&FROM=$dia$hora&TO=$dia$hora$url");
  23.  
  24. if (defined $pagina) {
  25. if ((my $datos) = $pagina =~ m/^<PRE>(.+?)<\/PRE>/sim) {
  26.  
  27. open (FICHERO, ">$fecha");
  28.  
  29. for my $linea (split "\n", $datos) {
  30. next if $linea !~ /^\s*\d/; # Nos quedamos solo con los datos de la tabla
  31.  
  32. my $pres = substr $linea, 0, 7;    # Presión [hPa].
  33.  
  34. next if $pres != 1000
  35.     and $pres != 925
  36.     and $pres != 850
  37.     and $pres != 700
  38.     and $pres != 500
  39.     and $pres != 400
  40.     and $pres != 300
  41.     and $pres != 250
  42.     and $pres != 200
  43.     and $pres != 150
  44.     and $pres != 100 ;
  45.  
  46. #if ($pres !~ 150 ) {$pres = 150 };
  47.  
  48. my $hght = substr $linea, 8, 14;   # Altura geopotencial [mts].
  49. $hght =~ s/      /nan/;
  50. my $temp = substr $linea, 15, 6;   # Temperatura del aire [°C].
  51. $temp =~ s/     /nan/;
  52. #my $dwpt = substr $linea, 22, 6;   # Temperatura del punto de rocío [°C].
  53. #$dwpt =~ s/     /nan/;
  54. my $relh = substr $linea, 29, 6;   # Humedad relativa [%].
  55. $relh =~ s/      /nan/;
  56. #my $mixr = substr $linea, 36, 6;   # Razón de mezcla [g/kg].
  57. #$mixr =~ s/     /nan/;
  58. my $drct = substr $linea, 43, 6;   # Dirección del viento [grados].
  59. $drct =~ s/      /nan/;
  60. my $sknt = substr $linea, 50, 6;   # Intensidad del viento [nudos].
  61. $sknt =~ s/      /nan/;
  62. #my $thta = substr $linea, 57, 6;   # Temperatura potencial [K].
  63. #$thta =~ s/     /nan/;
  64. #my $thte = substr $linea, 64, 6;   # Temperatura potencial equivalente [K].
  65. #$thte =~ s/     /nan/;
  66. #my $thtv = substr $linea, 71, 6;   # Temperatura potencial virtual [K].
  67. #$thtv =~ s/     /nan/;
  68.  
  69. my $gar = $GRD2RAD * $drct; #cambio la direccion del viento que esta en grados a radianes.
  70. my $nam = $convertir * $sknt; #  cambio la velocidad del viento qe esta en nudos a [m/s].
  71.  
  72. my $u = (-1) * $nam * sin $gar; #componente u del viento.
  73. $u =~ s/^-0.00/ 0.00/;
  74. my $v = (-1) * $nam * cos $gar; #componente v del viento.
  75. $v =~ s/^-0.00/ 0.00/;
  76.  
  77. #printf FICHERO "%6.0f %6.0f %6.1f %6.1f %6.0f %6.2f %6.0f %6.0f %6.1f %6.1f %6.1f\n", $pres, $hght, $temp, $dwpt, $relh, $mixr, $drct, $sknt, $thta, $thte, $thtv;
  78. printf FICHERO "%6.0f %6.0f %6.1f %6.0f %6.0f %6.1f %6.2f %6.2f\n", $pres, $hght, $temp, $relh, $drct, $nam, $u, $v;
  79. }
  80. close (FICHERO);
  81. }}}}}}  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Que me descarga esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1000    166   10.6     79    210    1.5   0.77   1.34
   925    810    5.6     86    130    1.0  -0.79   0.66
   850   1503   13.4      7    145    4.1  -2.36   3.37
   700   3121    6.0    nan    315    8.2   5.82  -5.82
   500   5790  -11.5    nan    305   21.6  17.70 -12.39
   400   7460  -23.9    nan    290   28.3  26.59  -9.68
   300   9490  -39.9    nan    300   33.4  28.96 -16.72
   250  10710  -46.7    nan    290   50.4  47.38 -17.24
   200  12170  -53.3    nan    290   62.2  58.49 -21.29
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


La primera columna debe contener estos valores: 1000, 925, 850, 700, 500, 400, 300, 250, 200, 150 y 100, con sus respectivas filas. Y algunas veces, como sucede en la matriz que descarga el script, no está completa (faltan las filas de los 150 y 100).
Y lo que quiero es que cuando falten datos se descarguen así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  1000    166   10.6     79    210    1.5   0.77   1.34
   925    810    5.6     86    130    1.0  -0.79   0.66
   850   1503   13.4      7    145    4.1  -2.36   3.37
   700   3121    6.0    nan    315    8.2   5.82  -5.82
   500   5790  -11.5    nan    305   21.6  17.70 -12.39
   400   7460  -23.9    nan    290   28.3  26.59  -9.68
   300   9490  -39.9    nan    300   33.4  28.96 -16.72
   250  10710  -46.7    nan    290   50.4  47.38 -17.24
   200  12170  -53.3    nan    290   62.2  58.49 -21.29
   150    nan    nan    nan    nan    nan    nan    nan
   100    nan    nan    nan    nan    nan    nan    nan  
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Les doy las gracias de antemano por su colaboración.
lis
Perlero nuevo
Perlero nuevo
 
Mensajes: 106
Registrado: 2008-05-27 21:43 @946

Re: Al descargar reemplazar espacios vacíos por NaN

Notapor explorer » 2009-12-21 13:55 @621

Pero ¿solo deben aparecer esos valores? ¿ninguno más?

Se podría hacer creando antes las filas, llenas de nan, y guardarlas en un array o en un hash. Luego, al leer el fichero, los valores leídos van sobreescribiendo los creados con nan.

Se parece un poco a lo hecho en este abril.
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


Volver a Básico

¿Quién está conectado?

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