martes, 20 de diciembre de 2022

Power Query: Buscando archivos

Una situación habitual es encontrar ciertos archivos entre un mar de carpetas y subcarpetas. Hoy veremos cómo conseguir personalizar esa búsqueda y logar el éxito.

Supongamos una nube de carpetas y subcarpetas, y en cada nivel distintos archivos, distribuidos de forma caótica :O

Nuestro objetivo identificar y ubicar algunos de ellos que cumplan algunos requisitos respecto al nombre.

En primer lugar, muy importante, es emplear la función M correcta, en este caso nos interesa acceder a la totalidad de archivos, independientemente del nivel de carpetas en que se encuentren... por ello la función que buscamos es:
Folder.Files(path as text, optional options as nullable record) as table
Función que nos devuelve una tabla que contiene una fila por cada archivo que haya en la carpeta indicada y todas sus subcarpetas.
Cada fila contiene las propiedades del archivo y un vínculo a su contenido.
OJO, no caer en la tentación de usar:
Folder.Contents(path as text, optional options as nullable record) as table
Que únicamente nos devuelve una tabla que contiene una fila para cada carpeta y/o archivo que se encuentra en dicha carpeta !!, pero nunca el contenido de subcarpetas!!.

Asi pues, Folder.Files es nuestra función.
Una vez conseguido el listado completo de archivos, en cualquier nivel de nuestra carpeta, llega el momento de identificar y listar solo aquellos que cumplan, respecto del nombre de archivo, alguna condición.
Obviamente podríamos aplicar una secuencia de filtros, pero veremos una alternativa con List.Accumulate que nos permitirá iterar en la búsqueda por distintos elementos.

Veamos nuestro código creado en una Consulta en blanco dentro del editor de Power Query:
let
    Origen = Folder.Files("E:\excelforo\TEST_CARPETAS\"),
    DATOS = Table.Buffer(Origen),
    
    //Tabla creada adrede para añadir filas coincidentes
    TablaRecupera=#table({"Folder Path","Name"},{{"",""}}),

    CreamosTabla=List.Accumulate(
                        TblCRITERIA[Criterios_Búsqueda],    //Lista conceptos a buscar
                        TablaRecupera,  //Inicio
                        (acum,concepto_buscado)=>
                            let
                                //buscamos cada concepto
                                TablaRdo=Table.SelectColumns(
                                        Table.SelectRows(DATOS, each Text.Contains([Name], Text.From(concepto_buscado))),
                                        {"Folder Path","Name"}),
                                //Lo incorporamos a los registros anteriores...
                                AddDato=Table.Combine({acum, TablaRdo})
                            in 
                                AddDato ),
    //Quitamos los registros/filas vacías...                            
    QuitaBlanco = Table.SelectRows(CreamosTabla, each not List.IsEmpty(List.RemoveMatchingItems(Record.FieldValues(_), {"", null})))
    

in
    QuitaBlanco

Power Query: Buscando archivos

A partir de una tabla auxiliar 'TblCRITERIA' en nuestra hoja de cálculo:
Power Query: Buscando archivos

Personalizamos los criterios de búsqueda sobre el nombre del archivo... encuentre donde se encuentre, dentro de la carpeta indicada en la primera línea de código.
El uso de List.Accumulate para aplicar un filtro iterativo por los distintos conceptos, permitiendo añadir nuevos registros a una tabla creada desde cero...

No hay comentarios:

Publicar un comentario

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