適材適所

PowerShellを中心にプログラミングやシステム管理の備忘録的なブログ

【Power Query M式言語】表を合体する方法について解説【Table.Combine関数】

M式言語で複数の表を合体させたい

ある大量のログファイルを全て合体させなくてはならない場面に遭遇しました。

そのログファイルは全部同じ項目で構成されたテキストファイルでした。

こんなときこそM式言語の出番!!

というわけで同じファイル、つまり表を合体させるときのM式言語の書き方です。

M式言語ではTable.Unionではなく、Table.Combine

SQLで表を単純に合体させるときはUnionという命令を使います。

しかし、M式言語はUnionではありません。

テーブル関数のTable.Combine関数を使います。

Table.Combineの構文は次のとおりです。

Table.Combine(tables as list, optional columns as any) as table

tablesには合体させたいテーブルをリスト形式で指定します。

columnsはオプションですが、合体させた後、結果として出力するカラムを指定することができます。

指定しなければ全てのカラムを持ったテーブルが返されます。

複数のテキストやCSVデータを合体する

Csv.Document関数を使ってテキストやCSVファイルを読み込めば、簡単に合体することができます。

let
    txt1 = Csv.Document(File.Contents("C:\examle1.txt")),
    txt2 = Csv.Document(File.Contents("C:\examle2.txt")),
    txt3 = Csv.Document(File.Contents("C:\examle3.txt")),
    out=Table.Combine({txt1,txt2,txt3})
in
    out

複数のテキストやCSVデータを合体しつつさらに新しいカラムを追加する

さらに新しいカラムを追加しつつ、テキストを合体させることも容易です。

カラムを追加するときは、Table.AddColumn関数を使います。

let
    txt1 = Table.AddColumn(Csv.Document(File.Contents("C:\examle1.txt")),"新しいカラム",each Text.From("中身1")),
    txt2 = Table.AddColumn(Csv.Document(File.Contents("C:\examle2.txt")),"新しいカラム",each Text.From("中身2")),
    txt3 = Table.AddColumn(Csv.Document(File.Contents("C:\examle3.txt")),"新しいカラム",each Text.From("中身3")),
    out=Table.Combine({txt1,txt2,txt3})
in
    out

複数のテキストやCSVデータを合体しつつさらに新しいカラムを追加する

さらに新しいカラムを追加しつつ、テキストを合体させることも容易です。

カラムを追加するときは、Table.AddColumn関数を使います。

let
    txt1 = Table.AddColumn(Csv.Document(File.Contents("C:\examle1.txt")),"新しいカラム",each Text.From("中身1")),
    txt2 = Table.AddColumn(Csv.Document(File.Contents("C:\examle2.txt")),"新しいカラム",each Text.From("中身2")),
    txt3 = Table.AddColumn(Csv.Document(File.Contents("C:\examle3.txt")),"新しいカラム",each Text.From("中身3")),
    out=Table.Combine({txt1,txt2,txt3})
in
    out

指定したカラムだけを抽出する

オプションのcolumnsを使うことで、特定のカラムだけを持った合体表を作成することができます。

下記の例は、新しく追加した、新しいカラムだけを持った表を抽出する例です(あんまり意味がない例かもしれませんが・・・)。

let
    txt1 = Table.AddColumn(Csv.Document(File.Contents("C:\examle1.txt")),"新しいカラム",each Text.From("中身1")),
    txt2 = Table.AddColumn(Csv.Document(File.Contents("C:\examle2.txt")),"新しいカラム",each Text.From("中身2")),
    txt3 = Table.AddColumn(Csv.Document(File.Contents("C:\examle3.txt")),"新しいカラム",each Text.From("中身3")),
    out=Table.Combine({txt1,txt2,txt3},{"新しいカラム"})
in
    out

ちなみにcolumnsは例え1つのカラムを指定する場合でもリスト形式にする必要があります。

終わりに

M式言語で表を合体させる方法について紹介しました。

単純にテキストデータを結合するだけであれば、PowerShellでもいいのですが、

カラムを追加したり型を指定したりすることが比較的簡単にできるのはM式言語の強味かなと思います。

これらの情報が少しでも誰かのお役に立てばと思います。

というわけでここまでお読み頂き、ありがとうございました。

参考

Table.Combine - PowerQuery M | Microsoft Learn
Table.AddColumn - PowerQuery M | Microsoft Learn