jueves, 5 de noviembre de 2020

Power Query: Seleccionando columnas según criterio de nombre

Hace un par de semanas en este post sobre combinaciones, en una parte de la consulta emplee un método para seleccionar ciertas columnas de nuestra consulta...
El truco se basaba en aprovecharse de la línea de tiempo en que se iban generando las columnas, para a partir de ahí recuperar sus nombres (Table.ColumnNames) y poder seleccionarlos posteriormente.
El método, por supuesto, válido no era el más óptimo, pero era interesante para conocer algunas funciones M.

Hoy aprenderemos un sistema más simple y claro para seleccionar las columnas de una consulta según un criterio aplicado al nombre de las columnas
Power Query: Seleccionando columnas según criterio de nombre

La idea es recuperar de nuestra Tabla de trabajo ('TblBUDGET') solo aquellas columnas que contengan, en su nombre de campo, la palabra clave indicada en la celda C10 (a la que hemos asignado un nombre definido 'ndTipo').
Para ello, como siempre podemos empezar por Cargar la tabla desde la ficha Datos > grupo Obtener y transformar > Desde Tabla o Rango, y una vez cargada en el editor de consultas de Power Query entraremos al editor avanzado donde escribiremos lo siguiente:
let
    Origen = Excel.CurrentWorkbook(){[Name="TblBUDGET"]}[Content],  
    //recuperamos el valor de la celda C10 con nombre definido 'ndTipo'
    Tipo = Excel.CurrentWorkbook(){[Name="ndTipo"]}[Content]{0}[Column1],
    
    //Generamos una Lista con los nombres de las columnas que cumplen la condición que nos interesa
    ListaNombreCols=List.Select(Table.ColumnNames(Origen), each Text.Contains(_ , Tipo)),

    //Filtro o Seleccionamos las columnas que cumplen la condición anterior
    MuestroCols=Table.SelectColumns(Origen,ListaNombreCols)

in
    MuestroCols

Power Query: Seleccionando columnas según criterio de nombre


Solo bastaría cambiar el valor de C10 y actualizar nuestra consulta para obtener aquellas columnas del origen (TblBUDGET) cuyos nombres de campo contengan el texto indicado...

Como vemos el código es bien simple... explicamos las cuatro líneas.

    Origen = Excel.CurrentWorkbook(){[Name="TblBUDGET"]}[Content],  

poco hay que explicar... toma los datos de la TblBUDGET de nuestro libro de trabajo...

La segunda línea recupera el valor de la celda C10 (ndTipo)
 
    //recuperamos el valor de la celda C10 con nombre definido 'ndTipo'
    Tipo = Excel.CurrentWorkbook(){[Name="ndTipo"]}[Content]{0}[Column1],


Clave y fundamental la tercera línea, donde usamos la ya conocida función M: Table.ColumnNames y la interesante List.Select
    //Generamos una Lista con los nombres de las columnas que cumplen la condición que nos interesa
    ListaNombreCols=List.Select(Table.ColumnNames(Origen), each Text.Contains(_ , Tipo)),

Recordemos que
Table.ColumnNames(table as table) as list
genera un 'lista' con los nombres de las columnas de la tabla. Es importante el matiz: genera una Lista. Lista que podremos pasar como argumento posteriormente en otras funciones!.

Si analizamos la función List.Select(list as list, selection as function) as list
vemos que devuelve una lista de valores de la 'lista' (nuevamente!!), que coincide con la condición dada.
En nuestro ejemplo una lista para cada columna cuyo nombre contenga el valor dado por la celda C10.

Finalmente, la última línea, es la que genera la 'tabla' final, con la función Table.SelectColumns(table as table, columns as any, optional missingField as nullable number) as table
donde el segundo argumento es una 'lista' con los nombres de las columnas a seleccionar!!... sí, una 'lista' como argumento.
De ahí que:
//Filtro o Seleccionamos las columnas que cumplen la condición anterior
    MuestroCols=Table.SelectColumns(Origen,ListaNombreCols)

De los datos obtenidos al inicio, en el paso 'Origen', esto es, de todas las columnas cargadas, seleccionamos solo las 'listadas' en el paso previo ('ListaNombreCols')

Puedes probar a indicar en C10 cualquier valor de tipo texto... nuestra consulta retornará solo aquellas columnas que contengan dicho texto ;-)

No hay comentarios:

Publicar un comentario

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