martes, 27 de diciembre de 2022

Power Query: Table.TransformColumns

Habitualmente, a la hora de trabajar con columnas que contienen libros binarios, listas o sencillamente Tablas, optamos por trabajar agregando una columna nueva, y realizar la transformación en el contexto de la función Table.AddColumn.
Nos acostumbramos a emplear técnicas que nos resultan cómodas...

Sin embargo, tenemos alternativas igual de interesantes, como Table.TransformColumns... incluso más, ya que no requiere agregar nuevas columnas.

La función Table.TransformColumns(table as table, transformOperations as list, optional defaultTransformation as nullable function, optional missingField as nullable number) as table
la cual transforma table mediante la aplicación de cada operación de columna enumerada en transformOperations (donde el formato es { nombre de la columna, transformación } o { nombre de columna, transformación, nuevo tipo de columna }). .

Planteemos el siguiente ejercicio. Tenemos tres tablas en nuestro fichero, una tabla por país.
Nuestro objetivo será consolidar/anexar dichas tablas en una hoja nueva... añadiendo una columna extra con el nombre de la tabla correspondiente.
Power Query: Table.TransformColumns

Veamos nuestro código creado en una Consulta en blanco dentro del editor de Power Query.
let
    //recuperamos todas las tablas del libro actual que empiecen con 'Tbl"
    Origen = Table.SelectRows( Excel.CurrentWorkbook(), each Text.StartsWith([Name],"Tbl")),

    //aplicamos la trasnformación a la columna de Contenido 'Content'
    Transformacion= Table.TransformColumns(Origen,
            {{"Content", each
                let
                    pos= List.PositionOf(Origen[Content], _),   //identifico el número de fila
                    nombre=Origen[Name]{pos},                   //recupero el Nombre desde el campo 'Name'
                    ordeno=Table.Sort(_, {"Fechas"}),           //ordeno cada tabla por Fechas
                    //y añado a cada tabla un campo nuevo con el nombre anterior
                    AddCol=Table.AddColumn(ordeno, "País", each nombre)
                in
                    AddCol }}),

    //acabamos Combinando (anexando) las distintas tablas de la columna 'Content'
    Consolidado=Table.Combine(Transformacion[Content])
in
    Consolidado

Power Query: Table.TransformColumns


TRUCO. En lugar de añadir una columna de Índice para determinar posiciones de cada fila, empleamos List.PositionOf para buscar cada elemento recorrido en la columna sobre esa columna....

Observa como la expresión each nos permite recorrer la/s columna/s que indiquemos, aplicándoles algún tipo de acción. En nuestro ejemplo, el proceso de transformación consiste en ordenar cada tabla y además incoporarle una nueva columna.

Para los amantes de lo simple, siempre es posible utilizar el método clásico de expandir columna.
let
    Origen = Table.SelectRows( Excel.CurrentWorkbook(), each Text.StartsWith([Name],"Tbl")),
    ExpandeContent = Table.ExpandTableColumn(Origen, "Content", 
                        {"Fechas", "Artículos", "Unidades"}, 
                        {"Fechas", "Artículos", "Unidades"})
in
    ExpandeContent


Mucho más sencillo... pero limitado por la definición de nombres de columnas.
Que en todo caso no hay que despreciar, al contario... en muchos casos, con un volumen alto de datos, la rapidez de ejecución es un punto a su favor.

No hay comentarios:

Publicar un comentario

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