Mostrando entradas con la etiqueta ficheros. Mostrar todas las entradas
Mostrando entradas con la etiqueta ficheros. Mostrar todas las entradas

domingo, 18 de noviembre de 2018

► Carga del fichero más reciente




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)
;

► Añadir campos nuevos a QVDs históricos




Tenemos un repositorio de QVDs con ficheros históricos desde hace varios años Existe un qvd por cada añomes. El Cuadro de Mandos los lee todos cada vez que se recarga.



En un momento dado, el origen de datos cambia e incluye un par de campos más que deben mostrarse en la aplicación. Los nuevos QVDs incluirán estos campos, pero ¿cómo evitar que la recarga falle cuando vaya a buscar esos campos en los ficheros históricos?
Existen varias soluciones:
1.- Modificar el script para que tenga en cuenta la fecha del .qvd y según esa fecha, cargue los nuevos campos o no.
2.- Modificar el script para crear una carga incremental de modo que una todos los .qvd en uno solo. En cada nueva recarga el CdM leerá ese único .qvd, añadirá nuevos campos cada vez que sea necesario y volverá a generarlo sobreescribiendo el anterior. De este modo podríamos ir añadiendo nuevos campos siempre que lo necesitemos.
3.- Añadir esos nuevos campos vacíos a cada .qvd histórico. El siguiente script lo hace:

SET vL.QVDPath = .\Empleados*.qvd;    //<-- Introducir aquí La ruta de los .QVDs de origen

FOR each File in filelist(vL.QVDPath)

    dummy:
   
LOAD filename() as nombreFichero
   
FROM [$(File)] (qvd)
   
WHERE RECNO()=1;

   
Let NombreFichero = Peek('nombreFichero',0,'dummy');

   
Drop table dummy;

   
$(NombreFichero):
   
LOAD *,
         ''
AS nuevo_campo1,
         ''
AS nuevo_campo2  //Lista de campos nuevos
    FROM [$(File)] (qvd);
       
   
Store $(NombreFichero)  INTO  [$(File)] (qvd);

   
Drop table $(NombreFichero);   

NEXT File; // Siguiente fichero de entrada

Contenido .QVD Antes: 



Contenido .QVD después