Power Queryでは、最も効率的なやり方を行うためには、多少のコーディングが入ることになります。これはPower Queryに限らず、DAX / Data Modelでも同じことであり、生産性を重視するのであれば人間がコンピューターに教えてあげる必要があります。今回はCsv.Documentを使ったベストプラクティスについて紹介しますが、先に”種明し”をすると以下の通りです。
結合の極意 = (Table型の列を展開する前に)ヘッダーの昇格 → Table.Combie( 前ステップ[列名] )
を使うことです。
何を言っているのか分からないと思いますので、以下図説していきます。難しい話のように聞こえますが、実際は非常にシンプルな手順となります。ステップとして4つあり、1つずつ見ていきます。
- 1. Csv.Documentで[Content]列から[カスタム]列にデータを抽出
- 2. Table.PromoteHeadersで調整する
- 3. 列のドリルダウン
- 4. Table.Combineを使う
- 5. ステップ数の比較
- まとめ
1. Csv.Documentで[Content]列から[カスタム]列にデータを抽出
前回の「通常の抽出法」で記載した下記テーブルに際して、[カスタム]列の右の←→アイコンをそのままクリックして展開をしましたが、ここではそれを行うのではなく、2のように少し変更を加えます。
2. Table.PromoteHeadersで調整する
この状態で数式バーに下記のように記載します。Excelのように、関数の中に関数を入れる形式(ネスト関数)で、eachの後のCsv.Document関数の前にTable.PromoteHeadersという関数で囲います。
すると、本来はColumn1~Column6まであった列が、[カスタム]列を展開する前に、既に「ヘッダーの昇格」が行われた状態となります。なお、Table.PromoteHeadersはテーブルのヘッダーを昇格させる関数であり、通常は
= Table.PromoteHeaders(前ステップ名)
のように、「前ステップ名」を囲う形で使用されますが、今回はネスト関数として使用しています。Table.PromoteHeadersはM言語の中でも数少ない、殆どのクエリで使用される使用頻度が最も高いクエリの1つです。
上図と異なり、ヘッダーが昇格されていることが確認できます。
3. 列のドリルダウン
ここで必殺ともいうべきコマンドを使うのですが、[カスタム]列をリスト化します。やり方はシンプルであり、
- [カスタム]列を右クリック
- ドリルダウン
するだけになります(下図)。
この操作を行うと、[カスタム]列がリスト化され、1列だけの状態となります。
4. Table.Combineを使う
最後はTable.Combineで上記②を囲うだけで全ファイルを結合できるようになります。すなわち、
= Table.Combine(追加されたカスタム[カスタム])
でリスト型クエリがテーブル型クエリに変わり、全てのファイルを結合されるようになります。
5. ステップ数の比較
結果は全く同じですが、やり方の違いによって、適用したステップにも大きな差が出ています。下図の通り、通常手法では不要な列の削除が必要だったり、ヘッダーが昇格される前に結合したがゆえに、結合後でもヘッダー名を除外する必要があったりとステップ数が多くなっていますが、Table.Combineのやり方ではその半分のステップ数で済みます。
なお、ここでは詳細を紹介しませんが、Table.Combineを使う理由はこれ以外にも「列名が異なるファイルの結合」に際して威力を発揮するものであり、手動でTable.PromoteHeaders等のコードを記入する必要はあるものの、Table.Combineを使ったやり方が殆どの場合においてベスト・プラクティスであることを覚えて頂ければと思います。
まとめ
今回は、CSVファイルを結合する際のベスト・プラクティスの1つである、Table.Combineを使ったやり方について紹介しました。初心者のうちはボタンをクリックしていくだけの作業で構いませんが、少し慣れてきたらこのようにExcelの関数を書くつもりでクエリを作っていくと、中上級者への道筋が開けやすいと思います。
次回はCSVファイルを結合するのに最もお手軽な方法(が、実は最も分かりにくいクエリが作成されてしまう方法)を紹介したいと思います。