martes, 3 de mayo de 2022

Power Query: Nombres de columnas distintas

Hace unos días, durante una formación de Power Query surgió la cuestión de si era posible tratar de alguna forma orígenes de información con iguales conceptos pero con distintos nombres en las columnas (por ejemplo distintos idiomas).

Planteemos el siguiente caso, tenemos un grupo de dos empresas que reportando de un mismo sistema, uno de ellos muestra los encabezados en español y otro en inglés... pero en el proceso de transformación, queremos anexar ambos informes, para evitar los errores previsibles, queremos modificar los de uno de ellos para homogeneizar ambos encabezados.
Power Query: Nombres de columnas distintas


Un intento de anexado de consultas directamente no nos daría un resultado aceptable, ya que duplicaría el número de columnas al no identificarlas con el mismo nombre:
Power Query: Nombres de columnas distintas


Cualquier otro intento, sin el previo tratamiento del nombre de los encabezados, igualmente nos devolvería fallo.

Asi pues nuestro trabajo comienza accediendo a una de las tablas para realizar la transformación necesaria que incluya el reemplazamiento de los encabezados en español por los de inglés... de acuerdo a la tabla de equivalencia:
Power Query: Nombres de columnas distintas

Tabla que cargaremos en nuestro editor de consultas en forma de función...
El código M de este tratamiento es la siguiente función que he llamado 'fxTRATAMIENTO':
(tbl as table)=>
let
    Origen = tbl,
    //obtenemos lista de los nombres de la columnas de la tabla con la que trabajamos
    LstCOLSNAME = Table.ColumnNames(Origen),
    //y por otro lado comvertimos en una Lista la tabla de traducciones
    //es una Lista de listas (español-ingles) una por cada fila
    LstREEMPLAZOS=Table.ToRows(EQUIV),

    //con un conteo identificamos el idioma de los nombres de las columnas
    //la idea es determinar mediante un conteo la lista de elementos coincidentes 
    //entre la lista de nombres de la tabla y la de los nombres en inglés de la tabla de equivalencias
    //en caso afirmativo, procedemosa renombrar las columnas!!
    Reemplazo=if List.Count(List.Intersect({LstCOLSNAME,EQUIV[UK]}))=0 then Table.RenameColumns(Origen, LstREEMPLAZOS) else Origen,

    //una vez aplicado el renombrado aplicamos un tipo de cambio de datos
    TipoCambiado = Table.TransformColumnTypes(Reemplazo,{{"Date", type date}, {"Product", type text}, {"Units", Int64.Type}}),
    
    //y finalizamos nuestra pequeña transformación de ejemplo aplicando un filtro variable..
    //ndPDTO responde a la carga de la celda D1 de la hoja, la cual hemos subido como consulta-parámetro previamente
    FiltroPDTO = Table.SelectRows(TipoCambiado, each ([Product] = ndPDTO))
in
    FiltroPDTO
A continuación cargaremos en una sola consulta todas las tablas del fichero de trabajo.
Para ello emplearemos el método explicado en este otro post.
Por tanto el código de esta consulta sería:
let
    //recuperamos todas las tablas y nombres definidos del libro de trabajo
    Origen = Excel.CurrentWorkbook(),
    //y aplicamos un filtro para quedarnos solo con las que nos interesan
    //en el ejemplo las que comienzan por 'Tbl' (que son las que contienen datos a anexar ES y UK)
    FilasFiltradas = Table.SelectRows(Origen, each Text.StartsWith([Name], "Tbl")),
    //aplicamos a cada fila la función recién creada...
    FunciónInvocada = Table.AddColumn(FilasFiltradas, "DATOS", each fxTRATAMIENTO([Content]))
in
    FunciónInvocada


Solo nos queda expandir la columna recien 'DATOS' recien incorporada y devolver el resultado a la hoja de cálculo..
O bien, en una consulta nueva vacía añadir el siguiente código que se encargará de anexar cuantas tablas haya en la columna DATOS del paso anterior:
let
    Origen = Table.Combine(TblsPAISES[DATOS])
in
    Origen

El resultado sería:
Power Query: Nombres de columnas distintas

donde comprobaríamos que a partir de la celda D1 podemos elegir y actualizar qué producto visualizar, y como sin fallos ni columnas de más, vemos exactamente las tres columnas deseadas...

No hay comentarios:

Publicar un comentario

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