martes, 26 de octubre de 2021

Power Pivot: Schema.ini ayudando a reconocer el tipo de datos

Quizá te haya pasado alguna vez al importar datos que Excel, o alguno de sus complementos, no reconoce adecuadamente los tipos de datos del fichero fuente...
Es en este momento donde el fichero Schema.ini te puede ayudar.

Seguramente nunca hayas escuchado, y ni te hayas fijado, sobre la existencia de este tipo de archivo...
A grandes rasgos lo que debes saber es que cuando empleamos controladores de tipo 'Text', esto es, al importar ficheros de tipo text, csv, etc.., el formato del archivo se determina mediante un archivo de información de esquema (nuestro Schema.ini).
El archivo Schema.ini siempre deberá ubicarase en el mismo directorio o carpeta que el origen de datos de texto. Este fichero proporciona a IISAM información sobre el formato general del archivo, el nombre de columna y la información del tipo de datos, y otras características de datos.
Especialmente recomendable hacer uso de este archivo Schema.ini cuando nuestra fuente tenga información de tipo DateTime, Currency o Decimal, o, por supuesto, en cualquier momento en el que queremos más control sobre el control de los datos de la tabla.

Indicar finalmente que el fichero Schema.ini especificaremos alguna de las cinco características siguientes:
1-Nombre del archivo de texto (txt, csv,...)
2-El formato de archivo
3-Nombres de campo, anchos y tipos de datos
4-Juego de caracteres (ANSI o OEM)
5-Conversiones de tipos de datos especiales

Veamos un ejemplo de uso...
Supongamos tenemos un fichero .csv con la siguiente estructura y valores:
Power Pivot: Schema.ini ayudando a reconocer el tipo de datos

Si accedemos a editor de Power Pivot en Excel, y desde el menú Inicio > Obtener datos externos > botón De otros orígenes > Archivos de texto (parte inferior)
Power Pivot: Schema.ini ayudando a reconocer el tipo de datos

Y a continuación indicaremos la ruta de nuestro fichero de texto (en este caso .csv), e importante elegiremos como Separador de columna: ficha(f):
Power Pivot: Schema.ini ayudando a reconocer el tipo de datos

Observamos como los valores del campo 'importe' no se han reconocido correctamente!!.
Finalizamos el proceso de importación y visualizamos los datos cargados en Power Pivot:
Power Pivot: Schema.ini ayudando a reconocer el tipo de datos


Carga incorrecta, ya que los importes han perdido su separador decimal!!!... y una vez dispuestos en Power Pivot, poco más podemos hacer con ellos... :'(

Una solución es añadir un fichero Schema.ini en la misma carpeta que el .csv de trabajo, con el siguiente contenido:
[test_Schema_ini.csv]
Format=TabDelimited
MaxScanRows=0
CharacterSet=ANSI
ColNameHeader=True
dateTimeFormat=yyyy-mm-dd hh:nn:ss

Col1="id" Long
Col2="campo1" Integer
Col3="fecha" DateTime
Col4="descripción" Text 
Col5="importe" Double
Col6="código" Long

DecimalSymbol= .
CurrencyDecimalSymbol= .
CurrencyThousandSymbol= ,

Power Pivot: Schema.ini ayudando a reconocer el tipo de datos


Ahora solo tenemos que actualizar nuestra conexión en Power Pivot (o recomendado, eliminarla y empezar la carga desde cero) y ....
Power Pivot: Schema.ini ayudando a reconocer el tipo de datos

La magía de 'Schema.ini' ha funcionado!!... nuestro importes, fechas, campos de texto, etc han tomado las especificaciones dadas por Schema.ini

Puedes probar un par de ejemplos y jugar con este fichero Schema.ini
Cambiemos por lo siguiente:
[test_Schema_ini.csv]
Format=TabDelimited
MaxScanRows=0
CharacterSet=ANSI
ColNameHeader=True
dateTimeFormat=yyyy-mm-dd hh:nn:ss

Col1="id" Long
Col2="campo1" Text
Col3="fecha" Date
Col4="descripción" Text 
Col5="importe" Long
Col6="código" Text

DecimalSymbol= .
CurrencyDecimalSymbol= .
CurrencyThousandSymbol= ,

Power Pivot: Schema.ini ayudando a reconocer el tipo de datos

Observa como al rehacer la conexión, los tipos de datos se adaptan a lo indicado.

Otro aspecto relevante es la posibilidad de 'jugar' con las fechas...
Si cargamos el siguiente Schema.ini:
[test_Schema_ini.csv]
Format=TabDelimited
MaxScanRows=0
CharacterSet=ANSI
ColNameHeader=True
dateTimeFormat=yyyy-dd-mm hh:nn:ss

Col1="id" Long
Col2="campo1" Text
Col3="fecha" Date
Col4="descripción" Text 
Col5="importe" Long
Col6="código" Text

DecimalSymbol= .
CurrencyDecimalSymbol= .
CurrencyThousandSymbol= ,

Y nos fijamos con la línea donde definimos el formato de la fecha:
dateTimeFormat=yyyy-dd-mm hh:nn:ss
donde he invertido el orden del mes y día:
Power Pivot: Schema.ini ayudando a reconocer el tipo de datos

Comprobammos cómo la fecha ha cambiado a 8 de enero (08/01/2021) en lugar de 1 de agosto (01/08/2021) !!.

Sin duda una herramienta fantástica para corregir lecturas de datos incorrectas.

Algo más de teoría antes de acabar.
Comentabamos al principio que este tipo de archivo Schema.ini admite hasta cinco conceptos... los cuales deben cumplir con las siguientes descripciones o definiciones:
1. Nombre del archivo:
siempre al inicio y entre corchetes. Por ejemplo: [fichero.txt] o [file.csv]

2. El formato de archivo:
donde indicaremos el formato y el separador de columnas de nuestro fichero, de acuerdo a las siguiente definiciones:
* Format=TabDelimited: campos delimitados por el tabulador.
* Format=CSVDelimited: campos separados por comas, i.e., un csv
* Format=Delimited(caracter personalizado) o también Format=Delimited( ): definimos cuál es el delimitador/separador (cualquier caracter excepto las comillas dobles, o simplemente sin especificar delimitador.
* Format=FixedLength: los campos los marcamos de acuerdo a un número fijo de caracteres.

3. Nombres de campo, anchos y tipos de datos
Aquí podemos definir si queremos que la primera fila sea la que muestre los encabezados o no...
ColNameHeader=True
También podemos indicar si deseamos que tome un número de filas para 'autodetectar' tipo de datos de los campos...
En nuestro caso, puesto que ya estamos indicando cuáles son estos tipos de datos, indicamos cero:
MaxScanRows=0
Y obviamente definimos los campos según la estructura:
n="Nombre del campo" tipo_dato [Width] [num caracteres de ancho]
Por ejemplo: Col2="campo1" Text
donde el ancho/número de caracteres es opcional...excepto si hemos definido Format=FixedLenght.
Un punto curioso es como numerar las columnas, ya que la documentación oficial indica sea un número natural, pero igualmente admite esa notación del ejemplo 'Col1'.
Igualmente el nombre del campo puede ir con o sin comillas, siempre que no tenga caracteres especiales.
El tipo de dato, clave en este tema, puede ser alguno de los siguientes:
Bit, Byte, Short, Long, Currency, Single, Double, DateTime, Text, Memo, Date

4. Juego de caracteres (ANSI o OEM)
Otro punto del Schema.ini es sobre qué juego de caracteres trabajamos ANSI o OEM.
CharacterSet=ANSI
esta definición invalida la configuración en el registro de Windows.

5. Conversiones de tipos de datos especiales
Finalmente, nuestro Schema.ini contiene varias opciones que podemos emplear para especificar en qué forma se convierten o muestran nuestros datos fuente.
Algunos de ellos, sin entrar en detalle, ya que se explican solos:
DateTimeFormat
DecimalSymbol: indicamos cuál es el separador decimal empleado en la fuente.
NumberDigits: decimos el número de decimales.
CurrencySymbol: cuál es el símbolo de la moneda (€, $, ...)
CurrencyThousandSymbol: separador de miles en caso de tipo moneda.
CurrencyDecimalSymbol: separador decimal en caso de tipo moneda.
En nuesto ejemplo he empleado algunos de estos:
dateTimeFormat=yyyy-dd-mm hh:nn:ss
    DecimalSymbol= .
CurrencyDecimalSymbol= .
CurrencyThousandSymbol= ,

Fíjate que al definir el formato de DateTimeFormat al indicar el formato de los minutos he empleado doble n (hh:nn:ss), en vez de doble mm (hh:mm:ss).
Esto es así en la mayoria de las ocasiones por evitar el conflicto entre meses y minutos.

Y por último la pregunta del millón... ¿Y si tengo varios ficheros en la misma carpeta??
En este caso, en el mismo fichero Schema.ini, definimos lo anterior para cada fichero, una a continuación del otro:
[test_Schema_ini.csv]
Format=TabDelimited
MaxScanRows=0
CharacterSet=ANSI
ColNameHeader=True
dateTimeFormat=yyyy-dd-mm hh:nn:ss

Col1="id" Long
Col2="campo1" Text
Col3="fecha" Date
Col4="descripción" Text 
Col5="importe" Long
Col6="código" Text

DecimalSymbol= .
CurrencyDecimalSymbol= .
CurrencyThousandSymbol= ,


[Segundo_Fichero.csv]
Format=Delimited(;)
MaxScanRows=0
CharacterSet=ANSI
ColNameHeader=True

dateTimeFormat=dd/mm/yyyy
CurrencySymbol=€
CurrencyDecimalSymbol= ,
CurrencyThousandSymbol= .

Col1="id" Short
Col2="medida" Text
Col3="importe" Double
Col4="fecha registro" Date

Con el anterioro Schema.ini podríamos trabajar con los dos ficheros indicados, cada uno con una configuración diferente!!.
Laborioso pero factible.

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.