
Tenemos un repositorio donde se van almacenando ficheros de datos. Uno por día. Cada día hay un proceso que debe cargar sólo el más reciente. Veamos los pasos necesarios para identificar cuál es el último fichero.
Es
imprescindible que la fecha esté en el nombre del fichero. En nuestro ejemplo
deberemos cargar sólo el 20181107_101611.csv
El script
es el siguiente:
// Nos colocamos en el directorio
donde se encuentran los ficheros
DIRECTORY 'import';
// Leemos todos los ficheros con extensión .csv que encuentra
for each File in filelist ('*'&'.csv')
// $(File) contiene el path absoluto del fichero. Nos queremos quedar sólo con el nombre. Aquí no vale usar la función FILENAME()
// porque esa función sólo se puede usar en una sentencia LOAD, no es una función de script.
//Para ello tomamos el path completo, buscamos la posición del último '\' y cortamos desde ahí hasta el final
let fichero = mid('$(File)',index('$(File)','\',-1)+1);
// Ya tenemos el nombre del fichero.
// Verificamos que el nombre sólo tiene números y el caracter '_' (excluyendo la extensión .csv)
// Si lo cumple, metemos el nombre en una tabla
IF len(purgechar(left('$(fichero)',index('$(fichero)','.csv')-1),'0123456789_'))=0 THEN
Ficheros_tmp1:
LOAD
'$(fichero)' as Name
autogenerate 1;
ENDIF;
// Repetimos los pasos para el restode ficheros
NEXT File
//Cuando ya tenemos todos los nombres en la tabla, los ordenamos en orden descendente....
NoConcatenate
Ficheros_tmp2:
LOAD *
RESIDENT Ficheros_tmp1
ORDER BY Name DESC;
Drop table Ficheros_tmp1;
//Y nos quedamos con el primero. Lo metemos en una variable....
let FicheroACargar=peek('Name',0,'Ficheros_tmp2');
Drop table Ficheros_tmp2;
// .... que usamos luego para cargar el fichero en memoria
EXCEL_MASTER:
LOAD campo1,
campo2,
.....
campoN
FROM
[$(FicheroACargar)] (txt, utf8, embedded labels, delimiter is ';', no quotes)
;
DIRECTORY 'import';
// Leemos todos los ficheros con extensión .csv que encuentra
for each File in filelist ('*'&'.csv')
// $(File) contiene el path absoluto del fichero. Nos queremos quedar sólo con el nombre. Aquí no vale usar la función FILENAME()
// porque esa función sólo se puede usar en una sentencia LOAD, no es una función de script.
//Para ello tomamos el path completo, buscamos la posición del último '\' y cortamos desde ahí hasta el final
let fichero = mid('$(File)',index('$(File)','\',-1)+1);
// Ya tenemos el nombre del fichero.
// Verificamos que el nombre sólo tiene números y el caracter '_' (excluyendo la extensión .csv)
// Si lo cumple, metemos el nombre en una tabla
IF len(purgechar(left('$(fichero)',index('$(fichero)','.csv')-1),'0123456789_'))=0 THEN
Ficheros_tmp1:
LOAD
'$(fichero)' as Name
autogenerate 1;
ENDIF;
// Repetimos los pasos para el restode ficheros
NEXT File
//Cuando ya tenemos todos los nombres en la tabla, los ordenamos en orden descendente....
NoConcatenate
Ficheros_tmp2:
LOAD *
RESIDENT Ficheros_tmp1
ORDER BY Name DESC;
Drop table Ficheros_tmp1;
//Y nos quedamos con el primero. Lo metemos en una variable....
let FicheroACargar=peek('Name',0,'Ficheros_tmp2');
Drop table Ficheros_tmp2;
// .... que usamos luego para cargar el fichero en memoria
EXCEL_MASTER:
LOAD campo1,
campo2,
.....
campoN
FROM
[$(FicheroACargar)] (txt, utf8, embedded labels, delimiter is ';', no quotes)
;
Muy bueno José Manuel! He utilizado parte de tu idea pero metiéndole un:
ResponderEliminarDate(filetime('$(importFile)'))
Parece que funciona ;)
Un saludo, nos vemos por los QlikUser