Aplicación de tipos

Por último, solo nos faltaría la aplicación de tipos, para lo que vamos a recurrir a una función que también ha aparecido ya varias veces: Table.TransformColumnTypes. Esta función requiere dos argumentos obligatorios: la tabla a la que aplicar los tipos y una lista de asignaciones de tipos a columnas. Todavía no hemos visto qué es una lista, pero sepamos que éstas se crean situando los valores que las componen entre llaves y separados por comas. Por ejemplo: {2, 4, 6}. Una lista formada por dos elementos que, a su vez, fuesen listas podría ser {{1, 2}, {3, 4}}. Una lista formada por un único elemento que, a su vez, fuese una lista podría ser {{1, 2}}.

Las asignaciones que hay que pasar en la lista mencionada son también listas, con dos elementos cada una: el nombre la columna y el tipo a aplicar.

Hagamos un primer intento: La tabla que estamos leyendo y transformando tiene -en este momento- el siguiente aspecto:

Tabla Geografía

Vemos que el primer campo (Geography Id) contiene números enteros, por lo que la fórmula de paso a añadir (si solo quisiéramos asignar tipo a esta columna) sería la siguiente:

tipos = Table.TransformColumnTypes(encabezados, {{"Geography Id", Int64.Type}})

La lista incluida como segundo argumento ({{"Geography Id", Int64.Type}}) está formada por un único elemento que es, a su vez, una lista ({"Geography Id", Int64.Type}) con dos elementos: el nombre del campo ("Geography Id") y el tipo a asignar (Int64.Type). El código del proceso ETL sería:

let
    url = "https://interactivechaos.com/data/curso_m/dataset.xlsx",
    file = Web.Contents(url),
    tables = Excel.Workbook(file),
    geography = tables{[Item="Geography",Kind="Sheet"]}[Data],
    encabezados = Table.PromoteHeaders(geography),
    tipos = Table.TransformColumnTypes(encabezados, {{"Geography Id", Int64.Type}})
in
    tipos

Si confirmamos la adición de esta última fórmula de paso, nuestra tabla tendría el siguiente aspecto:

Tabla Geografía

Ahora el campo Geography Id ya muestra el tipo que queríamos (lo que es comprobable viendo el icono con el texto "123" que se muestra a la izquierda de su nombre) y los otros tres campos mantienen el tipo por defecto que habían recibido (tipo texto). Si quisiéramos que la asignación de tipos a estos tres campos también fuese definida en nuestro código, habría que añadir tres parejas {nombre-campo, tipo} (con forma de lista) a la lista que se pasa como segundo argumento a la función Table.TransformColumnTypes. Es decir, la fórmula de paso sería la siguiente:

tipos = Table.TransformColumnTypes(encabezados,{{"Geography Id", Int64.Type}, {"Country", type text}, {"Region", type text}, {"City", type text}})

Para ver este código mejor, separémoslo en varias líneas:

    tipos = Table.TransformColumnTypes(
        encabezados,
        {
            {"Geography Id", Int64.Type},
            {"Country", type text},
            {"Region", type text},
            {"City", type text}
        }
    )

Y el código completo del proceso ETL sería el siguiente:

let
    url = "https://interactivechaos.com/data/curso_m/dataset.xlsx",
    file = Web.Contents(url),
    tables = Excel.Workbook(file),
    geography = tables{[Item="Geography",Kind="Sheet"]}[Data],
    encabezados = Table.PromoteHeaders(geography),
    tipos = Table.TransformColumnTypes(
        encabezados,
        {
            {"Geography Id", Int64.Type},
            {"Country", type text},
            {"Region", type text},
            {"City", type text}
        }
    )
in
    tipos

(la tabla resultante sería exactamente la misma que la mostrada en la última captura de pantalla)

La separación de una fórmula de paso en varias líneas no es necesaria y frecuentemente no se hace. Pero es algo que tenemos a nuestra disposición, de forma que, siempre que veamos conveniente aplicar este formato para entender mejor el código, podremos hacerlo.