Qlikview : Quitar ceros a la izquierda y otros trucos

Esta mañana hablando con alguien, nos preguntó si era posible eliminar los ceros a la izquierda de datos que vienen originalmente así desde el origen. No nos pregunten cual era el origen de datos (pero sí, era un archivo indexado de Cobol).

El problema era que el archivo tenia sus columnas de datos por ejemplo así: 0000000012345678 y se queria dejar así: 12345678 (claramente para después sumar la columna, para todos los registros).

Después de un preliminar “sí, por supuesto”, seguido de un período de dudas y de “prueba y error”, dimos con una solución:

=Replace(LTrim(Replace(Campo, '0', ' ')), ' ', 0)

O si se desea cargar desde el origen de datos, se debe usar así:

[MiTablaQV]:
LOAD Replace(LTrim(Replace(Campo, '0', ' ')), ' ', 0) AS MiCampo
...
FROM OrigenDeDatos;

Teniendo en cuenta que en QV las funciones siempre se ejecutan desde dentro hacia afuera, este código utiliza primero la función replace () para reemplazar todos los ceros en el campo con un espacio y luego utiliza el ltrim () función que elimina dicho espacio desde el principio de la cadena. A continuación, utilizamos replace () de nuevo para convertir los espacios que quedan de nuevo a cero.

Considerando lo anterior, en el caso que venga un valor 00000000000000, QV nos entregaría un espacio de largo 0 (”), y por lo tanto, la última expresión la podemos refinar más aún así:

[MiTablaQV]:
LOAD If(Replace(LTrim(Replace(Campo, '0', ' ')), ' ', 0)='', 0,
        Replace(LTrim(Replace(Campo, '0', ' ')), ' ', 0)) AS MiCampo
...
FROM OrigenDeDatos;

Otra situación es cuando en nuestros datos, las cifras vienen con separador de miles distintos al que usamos. Por ejemplo, vienen con punto ‘.’ y nosotros no queremos usar ningún separador o usar coma ‘,’. En este caso, usamos simplemente Replace(Campo, ‘.’, ”) , o Replace(Campo, ‘.’, ‘,’), respectivamente.

Otros trucos

Otra situación tediosa es cuando tenemos varios archivos fuente en un directorio y no queremos escribir la ruta a ellos una y otra vez. Para ello, usamos el comando LET para crear una variable y luego referenciarla al momento de la carga global o parcial, de la siguiente forma:

LET vMiDirectorio='C:\Mis documentos\Datos\2012\archivos-texto';

[TablaA]:
LOAD
CampoA1,
CampoA2,
CampoA3
FROM
[$(vMiDirectorio)\DatosA.txt]
(txt, codepage is 1252, embedded labels, delimiter is '\t', msq);

[TablaB]:
LOAD
CampoB1,
CampoB2,
CampoB3
FROM
[$(vMiDirectorio)\DatosB.txt]
(txt, codepage is 1252, embedded labels, delimiter is '\t', msq);

Simple no?. Esperamos sea de utilidad para ustedes. Un cordial saludo!

Comments ( 4 )

  1. / dagomezl
    para el último truco tienes un error te falto cerrar un paréntesis no? [TablaA]: LOAD CampoA1, CampoA2, CampoA3 FROM [$(vMiDirectorio)\DatosA.txt] (txt, codepage is 1252, embedded labels, delimiter is '\t', msq);
  2. / enmanuel4
    Sobre el primer truco: Qlikview considera numeros hasta 14 digitos, entonces esto tendria mismo resultado: [MiTablaQV]: LOAD Right(edad,14)*1 as MiCampo ... FROM OrigenDeDatos; Si el campo es alfanumerico, esto podria resultar: Right( KeepChar(edad,'0123456789'),14)*1 as MiCampo
  3. / enmanuel4
    sustituir edad por Campo en pos anterior

Leave a reply