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...
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:
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'
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:
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:
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.
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...
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...
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
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'
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
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.
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.