Skip to main content
Announcements
Have questions about Qlik Connect? Join us live on April 10th, at 11 AM ET: SIGN UP NOW
cancel
Showing results for 
Search instead for 
Did you mean: 
alexis_garcia
Creator II
Creator II

Validación registros

Hola,

Voy a plantear mi problema a ver si se puede solucionar:

Tengo ficheros planos, donde cada linea contiene todos los campos, es decir, cada campo se mapea por posición.

Ej: Las 4 primeras posiciones corresponden al año, las 2 siguientes al mes, las 2 siguientes al día y las 5 siguientes al valor.

Cómo puedo crear unas validaciones para que si llega un registro que no es correcto (por ejemplo, el año no tiene el formato correcto 'YYYY'), se invalide toda la línea y no entre en Qlikview? Es posible?

Adjunto ejemplo de fichero, que leo de la siguiente manera:

     LOAD

          @1:@4 as Año,

          @5:@6 as Mes,

          @7:@8 as Día,

          @9:@13 as Valor

FROM Ejemplo.txt (ansi, fix, no labels, header is 3, record is line);

Conforme lo que quiero hacer, la 1ª línea no debería de entrar, ya que el año no es correcto.

Saludos.

6 Replies
alex_millan
Creator III
Creator III

Hola Alexis,

como idea adicional, ¿y si importas todo en un mismo campo y luego en el propio script de Qlik realizas la separación (función subfield)?

Así, puedes implementar como primer chequeo el largo total de la línea (función len), y en este caso, al ser superior a 13 poner todo como nulo, por ejemplo.

O incluso, purgar los espacios en blanco (función purguechar) de la línea antes de controlar el largo de caracteres.

Luego puedes chequear cada campo implementando los controles que necesites.

Un saludo,

Alex

alex_millan
Creator III
Creator III

Se me olvidó que, respecto a lo de filtrar las filas que no pasen los controles, por ejemplo puede hacerlo cargando la info en una primera tabla temporal con un campo flag (donde indicaras para cada fila si los controles fueron satisfactorios o no). Luego en un segundo paso, cargas la tabla definitiva cargando con un resident de la temporal las fila con el flag positivo. Y por último eliminas la tabla temporal.

Un saludo

rubenmarin

Hola Alexis, al igual que Alex creo que se tendría que hacer la carga en varios pasos, puede ser en distintas tablas o usando precedent loads:

LOAD *

Where Checks;

LOAD Mid(@1, 1, 4) as Año,

  Mid(@1, 5, 2) as Mes,

  Mid(@1, 7, 2) as Día,

  Mid(@1, 9, 5) as Valor

Where Len(@1)=13;

LOAD @1

FROM

(txt, utf8, no labels, delimiter is '\t', msq);

En este caso quitaría la fila que ocupa 14 caracteres porque primero se comprueba que la línea tenga 13, en la parte de Checks se podrían incluir el resto de validaciones, por ejemplo: where Año>2000 and Año<2999 and IsNum(MakeDate(Año, Mes, Día))

alex_millan
Creator III
Creator III

Efectivamente la opción de Rubén es más eficiente, porque tal y como apunta no es necesario hacer la carga de una temporal, si no que en la misma carga se filtran los registros que no pasen la validación.

Por poner otro ejemplo:

TABLA:

LOAD Fecha, Anyo, Mes, Dia, Valor Where Check = 'Y';

LOAD If(IsNum(MakeDate(Anyo, Mes, Dia)) = 0, 'N', 'Y') As Check, MakeDate(Anyo,Mes,Dia) As Fecha, Anyo, Mes, Dia, Valor Where Check = 'Y';

LOAD If(Len(Datos)>13,'N','Y') As Check, Mid(Datos,1,4) As Anyo, Mid(Datos,5,2) As Mes, Mid(Datos,7,2) As Dia, Mid(9,5) As Valor;

LOAD PurgeChar(Datos,' ') As Datos;

LOAD @1 As Datos FROM (txt, utf8, no labels, delimiter is '\t', msq);

Con lo anterior, eliminas los espacios en blanco, chequeas que el largo resultante no supere los 13 caracteres y que la fecha resultante del año, mes y dia sea válida.

alexis_garcia
Creator II
Creator II
Author

Buenos días,

Muchas gracias a los dos.

En cuanto tenga un momento lo pruebo y os comento, pero de antemano parecen buenas soluciones.

Sois unos cracks!

Saludos.

Not applicable

Buenos días,

Alexis podrías añadir tambien al where:

Where Len(KeepChar(@1,'0123456789'))=13;

ya que por ejemplo quitaría ese espacio que comentabas en el ejemplo y además quitaría filas de len=13 donde se hubiese podido colar algún carácter que sea una letra.

Un saludo