Power Queryで列名を一括で変換する

この記事は[Microsoft Power BI Advent Calendar 2021](https://qiita.com/advent-calendar/2021/powerbi)に参加しています。
使用しているPower QueryはPower BIに付属の物で、2021/12/17時点の最新バージョンです。

# [Table.RenameColumns]を使ったPower Queryでの列名変換
Power Queryでテーブルの列名を変更する場合、[Table.RenameColumns]関数を使います。
## 概要
構文は以下の通りです。

```PowerQuery:Table.RenameColumns
Table.RenameColumns(table as table, renames as list, optional missingField as nullable number) as table 
= Table.RenameColumns(テーブル,{"A", "Rename_A"})
```

引数として列名をリネームする対象の[テーブル]と、リネーム前の列名とリネーム後の列名を組みにした[リスト]が必要になります。
[リスト]は必ずリネーム前後の列名で構成された二つのテキストである必要があり、それ以外はエラーが出ます。

:::note
{"A", "Rename_A"} 
:::

:::note alert
{"A"}
{"A", "Rename_A","Rename_B"}  
:::

複数の列名を変更したい場合、[リスト]に[リスト]をネストします。
例としてリネーム前後のテーブルを以下に示します。

リネーム前

| A | B | C |
|:-:|:-:|:-:|
| 1  |  2 |  3 |

リネーム後

| Rename_A | Rename_B | Rename_C |
|:-:|:-:|:-:|
| 1  |  2 |  3 |

これを行う構文は以下の通りです。

```PowerQuery:Table.RenameColumns
= Table.RenameColumns(テーブル,{{"A", "Rename_A"},{"B","Rename_B"},{"C","Rename_C"}})
```

## 変換表を使って列名を一括変換する
ここでは列名の変換表を用意して、テーブルの列名を一括変換していきます。

### 変換表から[リスト]を生成する
変換表のテーブルを基に[リスト]を生成します。

まず変換表のテーブルを用意します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/8376e2a4-745d-cf0d-5c67-a961a9b1ad0f.png)

次に`列の追加`タブから`カスタム列`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/84cac14f-032e-d093-b8dd-c6a1774f1bf6.png)

カスタム列の式は以下の通りです。

```PowerQuery:カスタム列
={[変更前の列名を格納した列], [変更後の列名を格納した列]}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/59372736-57fc-b691-79a7-a443913de47e.png)

これで[リスト]にネストされた[リスト]のカスタム列が追加されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/b33133f5-fa9d-0491-630b-2efc6d24c2e1.png)

中身は変更前の列名と変更後の列名のセットです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/8c846577-a260-c137-ada8-9f6f559ae42e.png)

次に追加したカスタム列を選択して、`変換`タブの`リストに変換`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/83ace97f-7a7c-8f87-8d51-b67472b903ee.png)

これで列名の一括変換に使うリストが完成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/1c59719d-c0bb-1f29-7ca8-77c7673fe289.png)

### 列名を変換する
列名を変換したいテーブルを用意します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/08618132-7202-afaf-192e-254202e816dc.png)

クエリにはテーブルと、先ほど用意した変換用のリストがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/fef3857e-d4f9-74b4-a09c-d9de29b43b45.png)

適当な列の名前を変更すると、`名前が変更された列`のステップが生成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/94b9a864-a371-feca-a935-c0bab687e277.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/41c03c4e-ddef-7578-854c-684bd4d99fb0.png)

[Table.RenameColumns]の[リスト]部分を用意した変換用のリストに置き換えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/71f2f0b1-9ff5-1ec8-f011-792f490d9fc2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/9593a237-6b9c-f683-1c6a-f36a968e22a5.png)

用意した変換リストに存在する列がリネームされました。

### MissingFieldの設定
変換用のリストの中に、テーブルに存在しない列があるとエラーになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/5e2b688a-dcaa-dc92-5537-8bc19eb50fcc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/203ba4f9-3943-5b6d-5de2-23de75ea3e51.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/2e2eee96-547b-7dc3-1dd8-4f6028ab5827.png)

この場合、[Table.RenameColumns]にオプショナルのMissingFieldを設定する事でエラーを回避できます。

```PowerQuery:Table.RenameColumns
Table.RenameColumns(table as table, renames as list, optional missingField as nullable number) as table 
= Table.RenameColumns(テーブル,{"A", "Rename_A"},MissingField.Ignore)
```

#### MissingField.Ignore
MissingField.Ignoreを使うと、リストに存在しない列を無視して列をリネームします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/94168a2a-de25-4da5-80d5-81889432d4c0.png)

#### MissingField.UseNull
MissingField.UseNullを使うと、列をリネームした上でリストに存在しない列を作成します。
この時、作成された列の値は全て`null`になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/3b6eedd6-2762-663d-70fb-75f56dfd030b.png)

##応用:列名に一括してプレフィックスを付ける
ここでは応用として、テーブルの全ての列にプレフィックスを付けていきます。
### テーブルから列名だけを抽出する
まずテーブルを用意します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/d9f79a64-01e9-b919-1879-bda731bc5682.png)
次に`ホーム`タブの`行の保持`から`上位の行を保持`を選択し、行数に0を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/57e72a72-6a91-6661-d4a3-b295f599320b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/f4c94c77-fd3e-7fd7-91c2-8d2c185c3853.png)
列名だけ残りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/9c263bdf-2e3f-7242-ee16-43bfd1c81cfe.png)
`ホーム`ダブの`1行目をヘッダーとして使用`から`ヘッダーを1行目として使用`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/39509479-45c9-bd52-b3bf-c0009f08c609.png)
列名だけのテーブルが出来ました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/63d177e0-8dad-1e10-8d01-c98a1272d379.png)
### 元の列名との変換表を作る
列を全て選択して、`ホーム`タブから`列のピボット解除`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/cd59401c-7ae3-3c91-2029-ea7ebb975b54.png)
`値`列に元の列名が格納されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/d874890d-a06e-b845-6be7-fd98f7da5c25.png)
`値`列を選択し、`列の追加`タブから`書式`内の`プレフィックスの追加`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/1265c9d7-3bba-fba4-e8f4-32f492cf23fa.png)
付けたいプレフィックスを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/c7cd9f30-fdef-041b-50ca-91ce1688a711.png)
これで元の列名との変換表が完成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/313502/a4e11000-4e48-e9f1-4ca5-dd036e335bb6.png)
後の手順は[変換表を使って列名を一括変換する](https://qiita.com/Yellow11/items/d5b7a1610e63c7efe955#%E5%A4%89%E6%8F%9B%E8%A1%A8%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E5%88%97%E5%90%8D%E3%82%92%E4%B8%80%E6%8B%AC%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B)と同じです。

## まとめ
### 変換前の列名と変換後の列名は必ずセットで
例外はありません。
### [リスト]の扱いに慣れよう
[テーブル]も[リスト]で構成されています。
### MissingFieldをうまく使おう
エラー処理だけではなく、様々なデータから決まった列を持ったテーブルを作れます。
***
これで一回一回列名を変えたりする手間が無くなるかもしれません。
手間をかけずに色々と出来れば楽になります。

[Table.RenameColumns]:https://docs.microsoft.com/ja-jp/powerquery-m/table-renamecolumns
[テーブル]:https://docs.microsoft.com/ja-jp/powerquery-m/expressions-values-and-let-expression#table
[レコード]:https://docs.microsoft.com/ja-jp/powerquery-m/expressions-values-and-let-expression#record
[リスト]:https://docs.microsoft.com/ja-jp/powerquery-m/expressions-values-and-let-expression#list