• Publicidad

Seleccionar los primeros ficheros de un directorio

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

Seleccionar los primeros ficheros de un directorio

Notapor enric73 » 2012-04-05 17:01 @751

Hola buenas noches,

¡A ver si alguien me puede ayudar!

En el siguiente script abro un directorio. Tengo unos 66 ficheros pero solamente me interesan los 16 primeros.

Estos ficheros, tienen el siguiente formato:

gfs.t00z.pgrbf00.grib2
gfs.t12z.pgrbf03.grib2

es decir, solamente cambia la cifra que está detrás de la 'f' con intervalos de 3 (f00, f03, f06, f09, f12...).

Si introduzco en @files el nombre de todos los ficheros hasta el número 16, los elige y luego ejecuta el ejecutable del programa wgrib2 sin problemas. Pero es una manera poco elegante.

¿Cómo puedo decir dentro o fuera de @files que solamente considere los primeros 16 ficheros, sin tener que escribirlos?

Y que luego se acuerde de cada uno al ejecutar el

@args = ("wgrib2 $_ -s | grep ':VGRD:10 m ' |wgrib2 -i $_ -text $Dadesdiari/VGRD10m$data.dat ");

Muchas gracias y buena Semana Santa a todos

chdir("$gribdir");
@files = ("gfs.t12z.pgrbf00.grib2"..."gfs.t12z.pgrbf48.grib2");
foreach(@files)
# open(LS, "ls $gribdir/gfs.t* |") or die $!;
# while
#(<LS>)
{
# $data = 0;
# chomp($input_root_name = $_);
# @path = $input_root_name ;
# $output_root_name = $path[$#path];
# $data = $data_inici;

$data = sprintf("%02d", $data);
@args = ("wgrib2 $_ -s | grep ':VGRD:10 m ' |wgrib2 -i $_ -text $Dadesdiari/VGRD10m$data.dat ");
system(@args) == 0 or die "system @args failed: $?";
@args = ("wgrib2 $_ -s| grep ':UGRD:10 m ' | wgrib2 -i $_ -text $Dadesdiari/UGRD10m$data.dat ");
system(@args) == 0 or die "system @args failed: $?";
escriu("arxiu txt generat");
# open(UGRD10m$data.dat,">$yyyymmdd") or die $!;
# print UGRD10m$data.dat "$yyyymmdd";
# close (UGRD10m$data.dat);
$interval_hours = 3;
$data = $data + $interval_hours;
}
# close(LS);
}
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Publicidad

Re: Seleccionar los primeros ficheros de un directorio

Notapor explorer » 2012-04-05 17:24 @766

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
foreach (@files[0..15])
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
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

Re: Seleccionar los primeros ficheros de un directorio

Notapor explorer » 2012-04-05 17:32 @772

Así queda un poco más bonito :)

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. chdir $gribdir;
  2. @files = qw( gfs.t12z.pgrbf00.grib2 gfs.t12z.pgrbf48.grib2 );
  3.  
  4. $data           = '00';
  5. $interval_hours = 3;
  6.  
  7. for (@files[0 .. 15) {
  8.  
  9.     # open(LS, "ls $gribdir/gfs.t* |") or die $!;
  10.     # while
  11.     #(<LS>)
  12.  
  13.     # $data = 0;
  14.     # chomp($input_root_name = $_);
  15.     # @path = $input_root_name ;
  16.     # $output_root_name = $path[$#path];
  17.     # $data = $data_inici;
  18.  
  19.     $args = qq(wgrib2 $_ -s | grep ':VGRD:10 m ' |wgrib2 -i $_ -text $Dadesdiari/VGRD10m$data.dat);
  20.     system($args) == 0 or die "system $args failed: $?";
  21.  
  22.     $args = qq(wgrib2 $_ -s| grep ':UGRD:10 m ' | wgrib2 -i $_ -text $Dadesdiari/UGRD10m$data.dat);
  23.     system($args) == 0 or die "system $args failed: $?";
  24.  
  25.     escriu("arxiu txt generat");
  26.  
  27.     # open(UGRD10m$data.dat,">$yyyymmdd") or die $!;
  28.     # print UGRD10m$data.dat "$yyyymmdd";
  29.     # close (UGRD10m$data.dat);
  30.  
  31.     $data = sprintf "%02d", $data + $interval_hours;
  32. }
  33.  
  34. # close(LS);
  35.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

¡Acuérdate de ponerle sintaxis Perl a tus códigos cuando los publiques aquí!
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

Re: Seleccionar los primeros ficheros de un directorio

Notapor enric73 » 2012-04-05 18:10 @798

Hola explorer, buenas noches y gracias,

Lo he cambiado y me queda:


chdir("$gribdir");
foreach(@files[0..4])
{
$data = sprintf("%02d", $data);
@args = ("wgrib2 @files -s | grep ':VGRD:10 m ' |wgrib2 -i @files -text $Dadesdiari/VGRD10m$data.dat ");
system(@args) == 0 or die "system @args failed: $?";
@args = ("wgrib2 @files -s| grep ':UGRD:10 m ' | wgrib2 -i @files -text $Dadesdiari/UGRD10m$data.dat ");
system(@args) == 0 or die "system @args failed: $?";
escriu("arxiu txt generat");

$interval_hours = 3;
$data = $data + $interval_hours;
}

Me salen errores ahora, pregunta, dentro de

@args = ("wgrib2 @files -s | grep ':VGRD:10 m ' |wgrib2 -i @files -text $Dadesdiari/VGRD10m$data.dat ");

¿Puedo poner el array @files? El fichero de salida depende del $data que va sumando 3 horas.

Me sale este error si tomo 4 ficheros

Use of uninitialized value $data in sprintf at ./VENT_GFStoWWW3.pl line 109.
Use of uninitialized value $files[0] in join or string at ./VENT_GFStoWWW3.pl line 110.
Use of uninitialized value $files[1] in join or string at ./VENT_GFStoWWW3.pl line 110.
Use of uninitialized value $files[2] in join or string at ./VENT_GFStoWWW3.pl line 110.
Use of uninitialized value $files[3] in join or string at ./VENT_GFStoWWW3.pl line 110.
Use of uninitialized value $files[0] in join or string at ./VENT_GFStoWWW3.pl line 110.
Use of uninitialized value $files[1] in join or string at ./VENT_GFStoWWW3.pl line 110.
Use of uninitialized value $files[2] in join or string at ./VENT_GFStoWWW3.pl line 110.
Use of uninitialized value $files[3] in join or string at ./VENT_GFStoWWW3.pl line 110.

*** FATAL ERROR: no input file ***


*** FATAL ERROR: no input file ***

system wgrib2 -s | grep ':VGRD:10 m ' |wgrib2 -i -text /home/sam/opt/wwatch3/v2.22/ASCII/2012040512/VGRD10m00.dat failed: 2048 at ./VENT_GFStoWWW3.pl line 111.
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Re: Seleccionar los primeros ficheros de un directorio

Notapor enric73 » 2012-04-05 18:24 @808

Hola explorer, muchas gracias, consultas

1- Sobre qw

@files = qw( gfs.t12z.pgrbf00.grib2 gfs.t12z.pgrbf48.grib2 );

¿toma todos los nombres que hay entre estos dos ficheros?

2- Sobre qq
$args = qq(wgrib2 $_ -s | grep ':VGRD:10 m ' |wgrib2 -i $_ -text $Dadesdiari/VGRD10m$data.dat);
system($args) == 0 or die "system $args failed: $?";

El qq, ¿qué significa?

Gracias
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Re: Seleccionar los primeros ficheros de un directorio

Notapor explorer » 2012-04-05 20:07 @879

enric73 escribiste: foreach(@files[0..4])
...;

@args = ("wgrib2 @files -s | grep ':VGRD:10 m ' |wgrib2 -i @files -text $Dadesdiari/VGRD10m$data.dat ");

¿Te estás dando cuenta de lo que estás poniendo?

Estás haciendo un bucle de 5 vueltas (una por cada archivo de los 5 primeros), y en cada una de las vueltas, estás metiendo todos los archivos en la ejecución de wgrib2...
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

Re: Seleccionar los primeros ficheros de un directorio

Notapor explorer » 2012-04-05 20:12 @883

enric73 escribiste:1- Sobre qw

@files = qw( gfs.t12z.pgrbf00.grib2 gfs.t12z.pgrbf48.grib2 );

¿toma todos los nombres que hay entre estos dos ficheros?
No. Solo toma esos dos.

El operador qw() sirve para crear una lista de elementos a partir de "palabras" (una "palabra" es aquello que está rodeado por espacios).

Así, la línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @files = qw( gfs.t12z.pgrbf00.grib2 gfs.t12z.pgrbf48.grib2 );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
es lo mismo que si la hubiéramos escrito como
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @files = ( 'gfs.t12z.pgrbf00.grib2', 'gfs.t12z.pgrbf48.grib2' );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
pero sin tantas comillas. Además, con qw() puedes colocar las "palabras" de forma más libre (recuerda que no se toma en cuenta el espacio en blanco):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. @files = qw(
  2.     gfs.t12z.pgrbf00.grib2
  3.     gfs.t12z.pgrbf48.grib2
  4. );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Más información en tu propio ordenador en perldoc -f qw

enric73 escribiste:2- Sobre qq
$args = qq(wgrib2 $_ -s | grep ':VGRD:10 m ' |wgrib2 -i $_ -text $Dadesdiari/VGRD10m$data.dat);
system($args) == 0 or die "system $args failed: $?";

El qq, ¿qué significa?
Dobles comillas.
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

Re: Seleccionar los primeros ficheros de un directorio

Notapor enric73 » 2012-04-06 01:40 @111

¡Buenos días, explorer!

Gracias, ¡sí me di cuenta del gazapo del @files!

Sabes, no entiendo muy bien el operador qw(). En este caso, sirve para crear una lista de elementos a partir de "palabras", pero en este caso solamente aparecen los nombres del primero y último fichero, no se da ninguna información del resto de palabras (ficheros). Después sí que con el for (@files) ¡seleccionamos 16 files! Pero no me queda clara la utilidad del operador qw() en este caso. Disculpad que a veces me cuesta un poco.

Me ha salido el siguiente error, no encuentra los ficheros...

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
./VENT_GFStoWWW3.pl 24 2012040600
----->  07:10:44 2012-04-06_00:00:00 2012-04-07_00:00:00
----->  07:10:44 Creant dades
El fitxer ja existeix at ./VENT_GFStoWWW3.pl line 88.
----->  07:10:44 Executant Extreu dades Vent del GFS
194.2:11680883:d=2012040600:VGRD:10 m above ground:anl:
194.1:11680883:d=2012040600:UGRD:10 m above ground:anl:
----->  07:10:45 arxiu txt generat
197.2:11758136:d=2012040600:VGRD:10 m above ground:9 hour fcst:
197.1:11758136:d=2012040600:UGRD:10 m above ground:9 hour fcst:
----->  07:10:46 arxiu txt generat
Use of uninitialized value $_ in concatenation (.) or string at ./VENT_GFStoWWW3.pl line 111.
Use of uninitialized value $_ in concatenation (.) or string at ./VENT_GFStoWWW3.pl line 111.

*** FATAL ERROR: no input file ***


*** FATAL ERROR: no input file ***

system wgrib2  -s | grep ':VGRD:10 m ' |wgrib2 -i  -text /home/sam/opt/wwatch3/v2.22/ASCII/2012040600/VGRD10m06.dat  failed: 2048 at ./VENT_GFStoWWW3.pl
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


El script lo he dejado para 4 ficheros y de la siguiente manera

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. # ----------------------------------------------------------------------------
  2. # Creem el directori de la simulacio
  3. # ----------------------------------------------------------------------------
  4. $gribdir    = "$home/gribs/gfs.$yyyymmddhh";
  5. $Dadesdiari    = "$DadesVentWWW3/$yyyymmddhh";
  6.  
  7.         escriu("Creant dades");
  8.         mkdir("$Dadesdiari")or warn $!;
  9.         # ungrib.exe - Extract meteorological fields from GRIB files
  10.         escriu("Executant Extreu dades Vent del GFS");
  11.         #$Var  = ':VGRD:10 m ';
  12. {
  13.         chdir("$gribdir");
  14.        
  15.  
  16.         @files = qw( gfs.t00z.pgrbf00.grib2     gfs.t00z.pgrbf09.grib2 );
  17.         $data      = '00';
  18.         $interval_hours = 3;
  19.        
  20.         for (@files[0 .. 3]) {
  21.  
  22.  
  23.         @args = ("wgrib2 $_ -s | grep ':VGRD:10 m ' |wgrib2 -i $_ -text $Dadesdiari/VGRD10m$data.dat ");
  24.         system(@args) == 0 or die "system @args failed: $?";
  25. @args = ("wgrib2 $_ -s| grep ':UGRD:10 m ' | wgrib2 -i $_ -text $Dadesdiari/UGRD10m$data.dat ");
  26.         system(@args) == 0 or die "system @args failed: $?";
  27.         escriu("arxiu txt generat");
  28.  
  29. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¡Gracias!
Última edición por explorer el 2012-04-06 10:25 @476, editado 1 vez en total
Razón: Poniendo marcas Perl y texto porque enric73 aún no sabe ponerlas... :(
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Re: Seleccionar los primeros ficheros de un directorio

Notapor explorer » 2012-04-06 10:21 @472

enric73 escribiste:Sabes, no entiendo muy bien el operador qw(). En este caso, sirve para crear una lista de elementos a partir de "palabras", pero en este caso solamente aparecen los nombres del primero y último fichero, no se da ninguna información del resto de palabras (ficheros). Después sí que con el for (@files) ¡seleccionamos 16 files! Pero no me queda clara la utilidad del operador qw() en este caso. Disculpad que a veces me cuesta un poco.
Hay dos archivos porque en tu código original solo aparecen dos archivos.

El operador qw() sirve para hacer una lista de cosas. El que tengas dos o doscientas, depende de ti. Yo solo puse dos porque solo pusiste dos en el código original. Si vas a conseguir el listado de archivos de otra manera, por ejemplo con '<*>', entonces no te hace falta, desde luego. El qw() es para cuando tienes que escribir la lista 'a mano' en el propio programa.

Mira otro ejemplo de uso del qw():

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @palabras_del_quijote = qw(
  2.     En un lugar de la Mancha, de cuyo nombre no quiero acordarme, no ha mucho
  3.     tiempo que vivía un hidalgo de los de lanza en astillero, adarga antigua,
  4.     rocín flaco y galgo corredor. Una olla de algo más vaca que carnero,
  5. );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Esa línea genera una lista de elementos, que van quedando en @palabras_del_quijote, de la misma manera que si lo hubiéramos escrito así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my @palabras_del_quijote = (
  2.     'En', 'un', 'lugar', 'de', 'la', 'Mancha,', 'de', 'cuyo', 'nombre', 'no', 'quiero', 'acordarme,', 'no', 'ha', 'mucho',
  3.     'tiempo', 'que', 'vivía', 'un', 'hidalgo', 'de', 'los', 'de', 'lanza', 'en', 'astillero,', 'adarga', 'antigua,',
  4.     'rocín', 'flaco', 'y', 'galgo', 'corredor.', 'Una', 'olla', 'de', 'algo', 'más', 'vaca', 'que', 'carnero,',
  5. );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

pero... como ves... nos ahorramos muuchas comillas, y muuuchas comas.
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

Re: Seleccionar los primeros ficheros de un directorio

Notapor enric73 » 2012-04-07 05:41 @278

¡Buenos días, explorer!

Gracias por el mensaje anterior, ¡me quedó claro! Mejor así, si uno puede ahorrarse comillas ¡mucho mejor! He introducido el nombre de los ficheros y ya está.

Tengo dos consultas:

1. ¿El operador qw() permite en su interior un contador? ¿O tendría que hacer un array con el for() y luego meter el array dentro del operador qw?

for($i = 0; $i < 15; $i++){
my @file = qw( gfs.t00z.pgrbf$i.grib2 );
}

2. Es sobre concatenar. Tal como tengo la línea

1 => strftime('%Y%m%d' , localtime)." ".$hs

me queda un espacio (ver en el ejemplo de abajo) entre

2012040600 000000

. Si quiero añadir 3 espacios, ¿simplemente he de dejar 3 espacios dentro de

1 => strftime('%Y%m%d' , localtime)." ".$hs

? Cuando lo hago, la segunda cifra me salta de línea...

Es decir, en vez de salir

2012040600 000000

con 3 espacios, aparece un salto de línea entre las dos cifras ¿Es normal? ¿O para introducir espacios no se hace de esta manera y voy errado?

2012040600
000000



# Posem la data
my $llarg = $tabla->length();
$tabla->row_set($llarg, {
1 => strftime('%Y%m%d' , localtime)." ".$hs,
});



$tabla->row_move($llarg, 0);

Ejemplo de salida con un simple espacio entre el localtime y $hs:

2012040600 000000
-6.27 1.56 -6.21 1.13 -5.72 0.80 -5.12 0.29 -4.43 0.14
-6.30 1.45 -6.23 1.02 -5.73 0.70 -5.13 0.20 -4.43 0.06
-6.32 1.34 -6.25 0.91 -5.74 0.60 -5.13 0.11 -4.43 -0.01
-6.35 1.23 -6.26 0.80 -5.75 0.50 -5.13 0.02 -4.43 -0.09
-6.37 1.12 -6.28 0.69 -5.76 0.40 -5.13 -0.07 -4.43 -0.17

¡¡¡¡Muchas gracias!!!!
enric73
Perlero nuevo
Perlero nuevo
 
Mensajes: 154
Registrado: 2012-03-16 06:27 @311

Siguiente

Volver a Básico

¿Quién está conectado?

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