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