jueves, 11 de febrero de 2021

Power Query: Renombrar Todas las Columnas de una vez

Una tarea árdua cuando trabajamos con Power Query sobre distintos orígenes, cada uno con encabezados o nombres de columnas diferentes, es renombrar dichas columnas...
Hoy aprenderemos en un único movimiento a renombrar todas las columnas de nuestra consulta.

Partiremos de un ejemplo descrito en este artículo del blog; y que también puedes ver en YouTube.
Partiremos de tres tablas de datos ('Tbl_2019','Tbl_2020' y 'Tbl_2021'), cada una con tres columnas... pero todas ellas con nombres distintos.
Y además la celda F2 con un nombre definido asignado ('ndAño') que nos permitirá obtener los datos de uno de nuestros tres orígenes...
Power Query: Renombrar Todas las Columnas de una vez.


Los primeros pasos se describieron en el artículo anterior, basicamente consiste en cargar solo como conexión las tres tablas ('Tbl_2019','Tbl_2020' y 'Tbl_2021')...

Con las tres tablas ya cargadas podemos crear una Consulta en blanco que renombraremos como 'TblFINAL' donde incluiremos el siguiente código M:
let
    pAño=Excel.CurrentWorkbook(){[Name="ndAño"]}[Content]{0}[Column1],
    Origen = if pAño=2019 then Tbl_2019 else 
                if pAño=2020 then Tbl_2020 else 
                Tbl_2021,

    //Renombramos columnas_______________________________//
    //Recuperamos una Lista los Nombres de las columnas actuales
    NombresColsOriginales = Table.ColumnNames(Origen),
    //Definimos una Lista con los Futuros Nombres de las tres columnas
    NombresColsNuevos={"Date","Product name","Units"},
    
    //Componemos una Lista 'doble' con las dos anteriores usando List.Zip
    RenombramosListado = List.Zip({NombresColsOriginales,NombresColsNuevos}),
    //Finalmente con Table.RenameColumns asignamos los nombres nuevos...
    RenombradoColumnas = Table.RenameColumns(Origen, RenombramosListado)

in
    RenombradoColumnas

Power Query: Renombrar Todas las Columnas de una vez

El resultado es que, independientemente del origen de datos (cualquiera de las tres tablas), los nombres de las columnas serán siempre los descritos: 'Date', 'Product name' y 'Units'
Power Query: Renombrar Todas las Columnas de una vez


Pero, ¿cuál es la técnica empleada?.
El uso de dos funciones importantes:
Table.RenameColumns(table as table, renames as list, optional missingField as nullable number) as table
Función importante que es capaz de renombrar las columnas de nuestra 'tabla'. Este reemplazamiento se da a partir de una lista de dos valores: {Nombre anterior, Nuevo nombre}
Si el nombre de la columna no existe, es posible controlarlo con el tercer argumento de la función (opcional): missingField con dos posibilidades
MissingField.UseNull
MissingField.Ignore
Por ejemplo, sobre nuestra Tbl_2019, podríamos aplicar individualmente el siguiente código para renombrar sus columnas:
let
    Origen = Excel.CurrentWorkbook(){[Name="Tbl_2019"]}[Content],
    RenombraColumnas=Table.RenameColumns(Origen,
            {{"Fecha","Date"},
            {"Cantidad","Units"},
            {"Nombre","Product name"},
            {"Campo NO existe","---"}},
            MissingField.Ignore)
in
    RenombraColumnas

Power Query: Renombrar Todas las Columnas de una vez


Clave para nuestro objetivo es la lista de dos valores {Nombre anterior, Nuevo nombre}:
{{"Fecha","Date"},{"Cantidad","Units"},{"Nombre","Product name"}}

Si somos capaces de 'montar' una lista como la anterior automáticamente, nuestro trabajo estará hecho... y aquí aparece la siguiente función M:
List.Zip(lists as list) as list
la cual conforma una lista de listas, combinando los elementos de dichas listas situados en las mismas posiciones.
Por ejemplo:
let
    Origen = List.Zip({{"a","b","c"},{1,22,333}})
in
    Origen

Lo que crearía una lista con la siguiente forma:
{{"a",1},{"b",22},{"c",333}}
esto es, una lista de doble valor, como la que requiere Table.RenameColumns.
Power Query: Renombrar Todas las Columnas de una vez


Así pues, con List.Zip construiremos nuestro listado de reemplazamiento... pero antes necesitamos saber cuáles son los nombres de las columnas actuales, lo que haremos con:
Table.ColumnNames(table as table) as list
que nos devuelve precisamente esto, una lista con los nombres de las columnas existentes.
Solo nos queda definir los nuevos nombres de las columnas, lo que conseguimos con una lista personalizada:
NombresColsNuevos={"Date","Product name","Units"}

Con lo que la parte importante, que es capaz de renombrar nuestras columnas quedaría:
//Renombramos columnas_______________________________//
//Recuperamos una Lista los Nombres de las columnas actuales
NombresColsOriginales = Table.ColumnNames(Origen),
//Definimos una Lista con los Futuros Nombres de las tres columnas
NombresColsNuevos={"Date","Product name","Units"},

//Componemos una Lista 'doble' con las dos anteriores usando List.Zip
RenombramosListado = List.Zip({NombresColsOriginales,NombresColsNuevos}),
//Finalmente con Table.RenameColumns asignamos los nombres nuevos...
RenombradoColumnas = Table.RenameColumns(Origen, RenombramosListado)


Y nuestra meta alcanzada...

No hay comentarios:

Publicar un comentario

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