• Publicidad

Reducir extracción de datos

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

Reducir extracción de datos

Notapor lis » 2009-04-06 21:30 @937

Hola amigos: tengo este script:

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

use LWP::Simple;

my $URL= 'http://weather.uwyo.edu/cgi-bin/sounding?region=samer&TYPE=TEXT%3ALIST&YEAR=2008';
my $url = '&STNM=85442';
my $GRD2RAD = (3.141592654 / 180);
my $convertir = 0.514444;

for my $mes  ( "12" ) {
for my $dia  ( "01" .. "31" ) {
for my $hora (  12  ) {

my $fecha   = "$dia-$mes-$hora";
my $fichero = "$fecha.dat";
my $pagina  = get("$URL&MONTH=$mes&FROM=$dia$hora&TO=$dia$hora$url");

if (defined $pagina) {
if ((my $datos) = $pagina =~ m/^<PRE>(.+?)<\/PRE>/sim) {

open (FICHERO, ">$fichero");

for my $linea (split "\n", $datos) {
next if $linea !~ /^\s*\d/; # Nos quedamos solo con los datos de la tabla

my $pres = substr($linea, 1, 6); # Algunas variables que entrega el radiosonda.
my $hght = substr($linea, 8, 14);
my $drct = substr($linea, 43, 6);
my $sknt = substr($linea, 50, 6);
my $gar = $GRD2RAD * $drct; #cambio la direccion del viento que esta en grados a radianes.
my $nam = $convertir * $sknt; #  cambio la velocidad del viento qe esta en nudos a [m/s].

my $u = (-1) * $nam * sin $gar; #componente u del viento.
my $v = (-1) * $nam * cos $gar; #componente v del viento.

printf FICHERO "%6.0f %6.1f %6.2f %6.2f\n" , $pres, $temp, $u, $v;
}
close (FICHERO);
}}}}}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4



Me descarga este tipo de datos:

Código: Seleccionar todo
1000   16.8   0.88   2.42
993   16.5   2.95   4.21
933   13.4  -1.53   1.38
925   15.4  -1.34   0.77
920   16.8  -1.36   0.72
910   17.2  -1.40   0.65
897   17.6  -1.44   0.55
858   16.0  -1.53   0.21
850   16.6  -1.54   0.13
804   16.8  -1.03   1.15
776   14.8  -0.25   1.00
761   15.8   0.02   1.03
738   14.3   0.43   0.93
707   12.2   0.32   2.03
700   12.8   0.22   2.56
697   13.2   0.09   2.57
660   10.6  -2.80   4.31
658   10.5  -2.95   4.21
636    9.0  -2.72   6.11
600    4.7  -0.85   9.74
532   -4.1  -2.80   1.30
526   -3.3  -2.43   0.84
524   -3.5  -2.46   0.75
506   -4.8  -0.51   0.00
501   -5.1  -0.51   0.04
500   -5.3  -0.51   0.04
490   -6.7  -1.03   0.00
458  -11.3   1.07  -3.98
453  -12.1   1.00  -3.99
400  -16.3   0.13  -1.54
397  -16.6   1.65  -1.97
396  -16.7   1.65  -1.97
390  -16.5   2.31  -2.76
375  -18.8   3.31  -3.94
350  -22.7   4.73  -4.73
349  -22.9   4.81  -4.65
336  -23.7   6.98  -5.26
308  -28.8  13.05  -4.75
300  -30.3  13.99  -6.52
268  -37.5  11.43  -9.59
257  -40.1  14.07  -9.49
250  -41.3  15.59  -9.00
245  -42.6  16.78  -7.83
234  -45.7  16.04  -8.17
227  -46.9  15.75  -8.73
208  -52.7  14.67  -9.53
201  -54.1  13.91  -9.74
200  -54.3  13.91  -9.74
189  -57.4  13.10 -13.10
188  -57.7  13.92 -12.98
184  -57.7  16.23 -11.79
178  -59.0  20.05  -9.35
176  -59.5  19.42  -8.24
173  -60.2  18.85  -6.86
153  -65.5  12.15  -6.73
150  -66.5  11.14  -6.43
149  -66.8  10.69  -6.17
146  -67.7   9.32  -4.35
135  -71.0  10.25  -0.90
133  -71.7   9.70   1.19
131  -71.9   8.22   2.99
126  -72.5   6.66  -0.58
120  -73.3   6.24   3.60
117  -72.0   0.76   8.71
116  -71.5  -0.31   8.74
112  -72.8  -4.37   7.57
112  -72.8  -4.37   7.57
105  -75.3  -6.66  -0.58
101  -76.7  -3.55  -0.63
100  -77.1  -2.80   1.30
93  -79.3  -0.80   2.98
90  -78.5   0.58   6.66
88  -77.9  -3.70   7.93
83  -76.5  -9.46   7.94
81  -75.9 -12.58   2.67
80  -76.2 -13.32  -1.17
79  -76.4 -12.42  -3.33
78  -76.6 -11.60  -4.22
75  -77.4 -10.13   1.79
70  -78.7  -4.46  -2.57
67  -80.2  -2.05   0.18
67  -80.3  -3.38   1.23
66  -79.8  -3.84   5.48
64  -78.2  -7.61   9.06
60  -75.1  -7.94   9.46
57  -72.5 -13.91   3.73
55  -70.7 -13.81   7.97
52  -68.0 -18.24   3.22
51  -67.1 -17.32   2.43
50  -68.5 -15.89   1.39
49  -69.1 -15.42  -0.54
47  -68.1 -14.69  -2.59
43  -65.4 -15.40   4.13
39  -62.5 -13.89   0.00
38  -61.7 -11.93   3.20
37  -60.9 -12.57   4.57
34  -58.4 -16.98   0.00
33  -57.5 -21.28   3.75
33  -57.1 -20.93   2.57
31  -58.3 -19.47  -1.70
31  -58.5 -18.99  -1.33
30  -57.5 -18.52   0.00
29  -56.7 -20.50   1.79
25  -53.3 -26.34  -4.65
23  -51.7 -22.46  -5.60
23    0.0 -21.86  -5.86


Como se han dado cuenta es muy muy largo y no todos los datos me sirven.
Lo que necesito es que de la primera columna se descarguen este datos: 1000, 925, 850, 700, 500, 400, 350, 300, 250, 200, 150, 100, con su respectiva fila.

He hecho algunos cambios en el script del principio, pero no logro obtener lo que quiero.

Les agradezco mucho su ayuda.
lis
Perlero nuevo
Perlero nuevo
 
Mensajes: 106
Registrado: 2008-05-27 21:43 @946

Publicidad

Notapor explorer » 2009-04-07 05:52 @286

Justo después de obtener el valor de $pres, comprueba si es uno de los valores que te interesan. Si no, salta a la siguiente vuelta:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
next if $pres != 1000
    and $pres != 925
    and $pres != 850
    and $pres != 700
    and $pres != 500
    and $pres != 400
    and $pres != 350
    and $pres != 300
    and $pres != 250
    and $pres != 200
    and $pres != 150
    and $pres != 100
    ;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Otra forma, usando el módulo List::MoreUtils:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use List::MoreUtils qw(none);
# ...

# ...
next if none { $i eq $_ } (1000, 925, 850, 700, 500, 400, 350, 300, 250, 200, 150, 100);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2009-04-07 07:50 @368, 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: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor lis » 2009-04-07 07:38 @360

Muchísimas gracias Explorer, como siempre un gran aporte.
lis
Perlero nuevo
Perlero nuevo
 
Mensajes: 106
Registrado: 2008-05-27 21:43 @946

Notapor Jenda » 2009-04-19 12:06 @546

Se puede hacer sin módulos o condiciones largas.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my %interesante = map {$_ => 1} (1000, 925, 850, 700, 500, 400, 350, 300, 250, 200, 150, 100);
...

next unless $interesante{$i};
...
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


o

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my %interes; @interes{1000, 925, 850, 700, 500, 400, 350, 300, 250, 200, 150, 100} = ();
...
next unless exists $interes{$i};
...
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Será mucho más rápido que las otras soluciones.

Jenda
-------------------------------------------------------
- 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 Básico

¿Quién está conectado?

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

cron