Miguel Escobar Publicada abril 30, 2019

Combinar o Anexar Datos: Patrón de Combinación Óptima

Power BIPower Query

Esta será el último artículo de la serie de publicaciones sobre combinar o anexar datos.

En la primera publicación vimos los conceptos básicos sobre cómo realizar la operación de anexar a través de la interfaz de usuario.

En la segunda publicación vimos la experiencia de Combinar archivos con archivos planos y lo fácil que es combinar tantos archivos como quieras.

En la tercera publicación hicimos un contraste entre la experiencia de Combinar archivos usando Libros de Excel en lugar de los archivos planos y las cosas que debíamos considerar en ese caso y que no consideramos con los archivos planos simples.

En esta cuarta y última publicación, volveremos a los conceptos básicos utilizando la función que descubrimos en la primera publicación: Table.Combine, que es la función perfecta para combinar/anexar datos.

¿Por qué este enfoque?

No me malinterpretes, los otros enfoques son completamente válidos, pero en algunos casos pueden agregar algo de sobrecarga a todo el proceso, lo cual es innecesario.

Me refiero específicamente a la experiencia de Combinar archivos que mejora la experiencia del usuario final, pero si tu objetivo es mejorar el rendimiento, entonces potencialmente podrías hacer un compromiso por esa experiencia del usuario final para optimizar tu consulta y hacerla que corra hasta un 500% más rápido.

No –  no estoy diciendo que debamos usar exactamente el mismo enfoque que utilizamos en la primera publicación de esta serie.

Eso tomaría demasiado tiempo y simplemente no escalará, pero ¿qué tal una combinación de método de Anexar y el de Combinar archivos?

Esto es más para los usuarios avanzados que para el usuario promedio de Power Query, pero tiene un gran impacto si tu objetivo es mejorar el rendimiento y esto es lo que hago personalmente cuando me contratan para optimizar las consultas de mis clientes.

La Configuración

Usaré el mismo conjunto de datos que usamos en la segunda publicación para Combinar archivos usando varios archivos planos de una serie de carpetas.

El objetivo final es usar una función llamada Table.Combine para combinar todos los archivos en lugar de usar el enfoque normal de Combinar Archivos que usa una función llamada Table.ExpandTableColumn.

Entonces, ¿cómo funciona la función Table.Combine? ¡Buena pregunta! Esta función requiere una lista de tablas para que pueda agregar todas esas tablas a una sola tabla grande.

Puedes obtener más información sobre qué listas, tablas y otros valores estructurados están dentro de Power Query y el lenguaje M aquí.

Permíteme mostrarte cómo se vería este nuevo patrón, pero toma en cuenta que el objetivo final siempre es el mismo (combinar tablas con Table.Combine), pero el viaje podría ser diferente dependiendo de dónde comiences y qué «puntos de control» o «checkpoints» necesites hacer.

Paso 1: Conectarse a la carpeta

Similar a lo que hemos visto antes, nos conectaremos a la carpeta:

Puedes descargar los archivos que estoy usando haciendo clic en el botón de abajo:

Simplemente conéctate a la carpeta donde se almacenan tus datos y obtendrás esta ventana:

Ahora hacemos clic en el botón Editar y nos dirigimos al Editor de Power Query. Recuerda, estamos tomando en cuenta las mismas suposiciones y notas que tuvimos en la publicación anterior (publicación 2).

Hasta ahora, básicamente estamos haciendo exactamente lo mismo que hemos hecho antes, pero las cosas están a punto de cambiar.

Paso 2: Buffer los binarios

Ya que estamos trabajando con archivos, generalmente es una buena idea almacenarlos en el búfer (guardarlos en la memoria) para que sea más fácil / rápido leer los archivos y combinarlos más rápido y para eso, eliminaré todas las columnas excepto la columna [Content] y luego haré clic derecho en esa columna para realizar una operación de desglose:

image

La operación que estoy haciendo transformará esta columna en una lista. Puedes obtener más información sobre este proceso y el enfoque de navegación completo en este artículo.

Después de eso, iré a la barra de fórmulas y simplemente la editaré para poder modificar la fórmula para que quede así:

= List.Transform ( #»Removed Other Columns»[Content], Binary.Buffer)

image

En esencia, he aplicado una función a cada fila en esa lista. Esa función se llama Binary.Buffer y realiza el almacenamiento en el caché del mismo archivo para que las cosas se ejecuten más rápido.

Paso 3: Crear una función personalizada

Probablemente me hayas escuchado decir las palabras «receta» y «función personalizada» de manera intercambiable, ya que la idea de una función personalizada es que estás creando una receta sobre cómo «cocinar» tus datos con algunos «ingredientes» (parámetros) como la entrada.

En este caso, vamos a crear nuestra propia función personalizada que se vería así:

(myFile as binary) => Table.PromoteHeaders( Csv.Document(myFile, [Encoding=1252]) )

image

Te recomiendo que leas mi serie sobre Parámetros en Funciones (aquí) para obtener más información sobre cómo se puede crear una función personalizada.

Lo único que esta función hace es interpretar el binario como un archivo CSV (usando la función Csv.Document) y luego promover los valores de la primera fila de ese archivo para que sean los encabezados de columna.

Paso 4: Invocar la función personalizada

Ahora, con tu función personalizada ya creada, puedes invocar esa función en tu consulta principal en la que almacenamos en búfer los binarios.

Terminarás creando un paso personalizado (haciendo clic en el botón fx en la barra de fórmulas) y luego agregando este fragmento de código:

= List.Transform( Content, fxRead)

image

y te darás cuenta de que ahora la lista tiene valores de tabla en lugar de binarios.

Ahora terminamos con una lista de tablas, que es exactamente lo que necesita la función Table.Combine y esa es la función que vamos a usar ahora:

Paso 5: Usar la función Table.Combine

De forma similar a lo que hicimos en el paso anterior, necesitamos crear un paso personalizado y ahora envolveremos la fórmula alrededor de la función Table.Combine y listo:

image

Ahora todos los datos se combinan en solo una tabla y puedes ver qué tan limpio y sencillo es este enfoque.

Te recomiendo que compares este enfoque con la experiencia de Combinar Archivos para que puedas establecer el tiempo de diferencia en tu propio ambiente. Esto es realmente importante cuando se trata de grandes volúmenes de datos.

Así es como se ve el código final:

let
Source = Folder.Files(«D:\Sales»),
#»Removed Other Columns» = Table.SelectColumns(Source,{«Content»}),
Content = List.Transform ( #»Removed Other Columns»[Content], Binary.Buffer),
Custom1 = List.Transform( Content, fxRead),
Custom2 = Table.Combine( Custom1 )
in
Custom2

image

Palabras finales

Me centré en usar archivos de una carpeta, pero este enfoque también funciona con cualquier otra fuente de datos, tablas de una base de datos, tablas de un servicio web o cualquier otra fuente de datos de que elijas. El objetivo final es crear una lista de Tablas usando el método que consideres adecuado y luego usar la función Table.Combine.

¡Comparte tus historias conmigo! ¿Has intentado optimizar tu consulta de Combinar Archivos? ¿Qué tan rápido se hace con este nuevo enfoque?

Power BIPower Query
Subscribe
Notify of
guest
3 Comentario
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Matias

Hola, como andas? recien veo esta funcionalidad, y me parece muy interesante. Hago esto mismo pero en forma manual, combino .txt (las facturas electronicas de la Agencia Federal Impositiva de Argentina) desde sharepoint y excel (necesito actualizarlo en forma automatica). Dado mi conociento basico tuve que encontrarle la vuelta para combinarlo en un excel (cada tanto paso los .txt a otra carpeta para levantarlo en el excel) y solo combino los nuevos .txt
Quisiera probar esta funcionalidad pero primero preguntarte si la funcion tambien funciona para .txt o si tengo que modificar el codigo (decime por favor cómo)

Angel

¿Cómo se haría para archivos no csv?