Tengo alrededor de 50 archivos XML que están estructurados de la misma manera. Quiero extraer varios valores de cada uno, con los valores en diferentes "filas" de la tabla XML.
En este momento, puedo usar Power Query para extraer una "fila" de la tabla XML para un archivo. Esto no me funciona porque:
- Necesito realizar esta consulta en varios archivos XML (no cada uno manualmente)
- La información que intento extraer está en diferentes "filas" de la tabla XML, por lo que si extraigo solo una fila, algunos de los otros valores están ocultos en una tabla anidada en esa fila.
¿Puedo usar Power Query para esto o tengo que usar VBA? ¿Hay recursos disponibles para este tipo de proyecto?
Respuesta1
La magia que buscas es Table.Combine(MyTable[ColumnOfTables])
en lugar de MyTable{0}[ColumnOfTables]
.
Para un archivo XML determinado (suponiendo que todos tengan la misma estructura), intente crear una consulta para obtener todo lo que necesita de un solo archivo. Recomiendo no hacer clic en la palabra "Tabla" dentro de una celda de la tabla para navegar. En su lugar, escriba cada paso a mano y nombre la fila que desee en lugar de asumir que siempre estará en el mismo orden. Comience con una consulta de
let
Source = Xml.Tables(File.Contents("C:\Temp\YourFile.xml"))
in
Source
Entonces mira cómo se ve eso. En el archivo XML con el que estaba jugando, vi una tabla con las columnas "Nombre" y "Tabla". Solo quería la fila donde el valor de la columna "Nombre" era "Cuerpo", así que cambié mi consulta a
let
Source = Xml.Tables(File.Contents("C:\Temp\YourFile.xml")),
Body = Source{[Name="Body"]}[Table]
in
Body
Por alguna razón que aún no entiendo, lo que vi fue una tabla similar con una sola fila que contiene el espacio de nombres. Suficientemente fácil. Repita el mismo paso.
let
Source = Xml.Tables(File.Contents("C:\Temp\YourFile.xml")),
Body = Source{[Name="Body"]}[Table],
#"namespace url here" = Body{[Name="namespace url here"]}[Table]
in
#"namespace url here"
Digamos que me dio una tabla con una columna llamada "Casos", cada una de las cuales contenía una tabla con una columna de "Participantes" y lo que quería era una lista de todos los participantes de los casos.
let
Source = Xml.Tables(File.Contents("C:\Temp\YourFile.xml")),
Body = Source{[Name="Body"]}[Table],
#"namespace url here" = Body{[Name="namespace url here"]}[Table],
Cases = Table.Combine(#"namespace url here"[Cases]),
Participants = Table.Combine(Cases[Participants])
in
Participants
Una vez que obtenga algo como esto para un archivo en particular, duplique la consulta, cámbiele el nombre a "fGetParticipants" (o cualquier nombre que tenga sentido para usted) y reemplace las dos primeras líneas con lo siguiente:
(record as record) as table =>
let
FilePath = record[File Path],
Source = Xml.Tables(File.Contents(FilePath)),
Esta consulta devolverá una función que toma una fila de la tabla como argumento, obtiene la ruta del archivo y luego hace lo mismo que antes.
Suponiendo que tiene o puede crear una consulta de rutas de archivos (comience con una consulta de una carpeta y agregue una nueva columna "Ruta de archivo" [Folder Name] & [Name]
, o lo que sea, solo necesita tener una consulta que contenga una columna llamada "Ruta de archivo" que contiene las rutas de archivo que desea), ahora puede tener una consulta como
let
Source = #"Name of your query containing a column called File Path",
#"Added Participants" = Table.AddColumn(Source, "Participants", fGetParticipants),
// Not all had participants, so some of the files resulted in errors...
#"Removed Errors" = Table.RemoveRowsWithErrors("#Added Participants", {"Participants"}),
// Combine them all into one huge table
#"All Participants" = Table.Combine(#"Removed Errors"[Participants])
in
#"All Participants"
Estoy seguro de que esto no le dará todo lo que necesita. Usted mencionó que había algo de anidamiento, no proporcionó muchos detalles y probablemente haya algunos casos extremos en sus datos que lo anterior no toca. Sin embargo, esto debería ayudarle a avanzar si desea hacerlo a través de PowerQuery.
Respuesta2
Vaya a Obtener datos -> Desde archivo -> Desde carpeta y seleccione la carpeta. Haga clic en Abrir y en la ventana emergente elija Combinar y transformar datos en el botón de menú Combinar. Después de eso, seleccione el último nodo del panel izquierdo.