enric73 escribiste:De esta manera la primera línea de los diferentes ficheros planos no se conserva... ¿Tiene alguna relación con el HeaderRow?
¡
Oops! Algo estaba mal... Corregido más abajo.
enric73 escribiste:Al final del proceso, querría añadir en la fila 1 del fichero final con la fecha del año (yyyymmddhh), ¿qué comando me recomienda que al introducir esta fila no me borre el resto? Ya tengo instalado el Class::Date
A ver... ¿A qué te refieres exactamente? ¿Insertar una línea delante de todas con la fecha? ¿O que esa fecha la insertemos solo en la primera columna, en la primera posición?
En el ejemplo que te pongo a continuación, insertamos una nueva fila al principio.
enric73 escribiste:Otra consulta, al ejecutar el script, se genera de forma paralela un carpeta llamada cache/ con ficheros UGRD*.dat.cache, ¿para qué sirven?
Eso se desactiva con la opción _CacheOnRead. El sistema de caché de este módulo es por si, más adelante, necesitas volver a leer los mismos archivos. El módulo se dará cuenta de que existe una copia prefabricada en el cache/, y lo leerá de allí.
La ventaja es que las lecturas desde el cache/ son mucho más rápidas que leyendo el archivo original. Sobre todo se nota si tienes archivos con miles o millones de datos.
Existe otro problema que no hemos comentado hasta ahora: este módulo toma por defecto la primera línea de cada archivo como el nombre de la columna. Podría darse el caso de que más de un archivo contuviera el mismo valor en la primera fila, y por lo tanto, el módulo sacaría un mensaje de error diciendo que no puede combinar esos archivos porque tienen el mismo nombre de columna. Si estás completamente seguro de que eso no se va a dar nunca, el programa lo puedes dejar tal cual. Pero si no es así, entonces el programa exige que tengamos creada, antes de la combinación, el listado de nombres de las columnas que vamos a leer. Podría ser algo tan simple como números: '1', '2', '3'... Y luego, en la salida, ponemos el _HeaderRow => 0, y los datos salen sin esas cabeceras.
Juntándolo todo, quedaría así:
Using perl Syntax Highlighting
#!/usr/bin/perl
use Data::CTable;
use POSIX 'strftime';
my $tabla = Data::CTable->new(); # Objeto Data::CTable
my @archivos = </home/sam/enric/ASCII/UGRD*>; # listado de los archivos
#print "Uniendo ", scalar(@archivos), " archivos\n";
# Combinación
for my $i ( 1 .. @archivos ) { # hacemos un bucle por todos ellos
$tabla->combine_file( $archivos[$i-1], { # combinamos un archivo
_HeaderRow => 0, # que no tiene cabecera
_FieldList => [ $i ], # porque la prefabricamos
_CacheOnRead => 0, # y no queremos caché
});
}
# aquí ya tenemos toda la tabla, con todas las columnas, cuyos nombres son 1, 2, 3, ...
# Ponemos la fecha
my $largo = $tabla->length(); # cómo es de grande esa tabla
$tabla->row_set($largo, { # $largo también es el índice de la nueva fila
# (las filas se numeran de 0 a $largo-1)
1 => strftime('%Y%m%d%H', localtime), # en la primera columna de esa fila ponemos la fecha
});
$tabla->row_move($largo, 0); # y subimos la fila arriba del todo
# Salida
$tabla->write( # escribimos el resultado
_FileName => 'vientos.dat', # aquí
_FDelimiter => "\t", # y tabulado
_HeaderRow => 0, # pero sin las cabeceras prefabricadas
);
__END__
2012031821
1 a A1
2 b B2
3 c C3
4 d D4
5 e E5
6 f F6
7 G7
8 H8
9 I9
J10
K11
L12
M13
N14
O15
P16
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4