同じ構造の XML ファイルが 50 個ほどあります。各ファイルから、XML テーブルの異なる「行」にある複数の値を抽出したいと考えています。
現時点では、Power Query を使用して、1 つのファイルの XML テーブルの 1 つの「行」を取得できます。これは、次の理由で機能しません。
- このクエリを複数の XML ファイルに対して実行する必要があります (各ファイルを手動で実行する必要はありません)
- 抽出しようとしている情報は XML テーブルの異なる「行」にあるため、1 行だけを取得すると、他の値の一部はその行のネストされたテーブルに隠れてしまいます。
これには Power Query を使用できますか、それとも VBA を使用する必要がありますか? このタイプのプロジェクトに利用できるリソースはありますか?
答え1
あなたが探している魔法Table.Combine(MyTable[ColumnOfTables])
は の代わりにですMyTable{0}[ColumnOfTables]
。
特定の XML ファイル (すべて同じ構造であると仮定) に対して、1 つのファイルから必要なものをすべて取得するクエリを作成してみてください。テーブル セル内の「テーブル」という単語をクリックして移動することはお勧めしません。代わりに、各ステップを手動で入力し、常に同じ順序であると想定するのではなく、必要な行に名前を付けます。次のクエリから始めます。
let
Source = Xml.Tables(File.Contents("C:\Temp\YourFile.xml"))
in
Source
それで、それがどのように見えるか見てみましょう。私が操作していたXMLファイルには、「名前」と「テーブル」の列があるテーブルがありました。「名前」列の値が「本文」である行だけが必要だったので、クエリを次のように変更しました。
let
Source = Xml.Tables(File.Contents("C:\Temp\YourFile.xml")),
Body = Source{[Name="Body"]}[Table]
in
Body
まだ理解していない理由で、私が見たのは、名前空間を含む 1 行の同様のテーブルでした。簡単です。同じ手順を繰り返します。
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"
「ケース」という列を持つテーブルがあり、各列には「参加者」の列を持つテーブルが含まれており、私が求めていたのはすべてのケースの参加者のリストだったとします。
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
特定のファイルに対してこのような結果が出力されたら、クエリを複製し、名前を「fGetParticipants」(またはわかりやすい名前) に変更し、最初の 2 行を次の行に置き換えます。
(record as record) as table =>
let
FilePath = record[File Path],
Source = Xml.Tables(File.Contents(FilePath)),
このクエリは、テーブル行を引数として受け取り、ファイル パスを取得して、以前と同じことを実行する関数を返します。
ファイルパスのクエリを持っているか、作成できると仮定すると(フォルダーのクエリから始めて、 の新しい「ファイルパス」列を追加する[Folder Name] & [Name]
か、または必要なファイルパスを含む「ファイルパス」という列を含むクエリが必要です)、次のようなクエリを作成できます。
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"
これで必要なものがすべて得られるわけではないと思います。ネストがあるとおっしゃっていましたが、あまり詳細が述べられておらず、おそらくデータには上記では触れられていないエッジ ケースがいくつかあるでしょう。ただし、PowerQuery 経由でこれを実行したい場合は、これが前進するのに役立つはずです。
答え2
「データの取得」->「ファイルから」->「フォルダーから」に移動し、フォルダーを選択します。「開く」をクリックし、ポップアップ ウィンドウで「結合」メニュー ボタンの下にある「データの結合と変換」を選択します。その後、左側のペインから最後のノードを選択します。