列名変更あれこれ


1行目の列昇格だけではうまく裁けないケースがあります。そこで、列昇格以外で、複数列をまとめて列名変更するコードを書いてみました。
分解すれば、UIでも出来るのかもしれませんが、試してません。m(_)m

例1:最初の列以外を昇格したい

例えば、「フォルダから」メニューで取ってきて、下図のようになった場合。

ファイル名を列名にあげてしまうと、こうなります。

これだと、先頭列を用いた処理が入っているクエリは、「1901.csv」が先頭でなくなったとか、消した途端に、エラーになってしまいます。

例1のコード

注意事項
 #"Changed Type"・・・対象となるテーブルの名前がこれだったというだけです。都度、適当に変えてください。
 List.Skipをかけた2つ目のリスト・・・この例では3行目(0始まりで2番目)に、列名にしたい値があるので、{2}としています。

列名差し替え例
= Table.RenameColumns(#"Changed Type",
                    List.Zip({ List.Skip(Table.ColumnNames(#"Changed Type"),1),
                               List.Skip(Record.ToList(#"Changed Type"{2}),1)
                              }
                    )
    )

結果がこちら↓

List.Zip()について

波括弧で囲った各リストについて、同じ要素位置ごとにリストにくくりなおす関数です。
上のコードを分解して実行してみたのが下図。

例2:DateTime表示でなくて、日にちだけの列名にしたい

 下図のように日付と数値が両方あると、日付はDateTimeの表示になってしまうようです。これではそのまま列名に昇格したくないですね。

例2のコード

 #"Changed Type"は例1と同じく、対象となるテーブルの名前なので、適当に変えてください。
また、この例では1行目(0始まりで2番目)に、列名にしたい値があるので、{2}としています。

列名差し替えその2
= Table.RenameColumns(#"Changed Type",
                    List.Zip({
                              Table.ColumnNames(#"Changed Type"),
                              List.FirstN(Record.ToList(#"Changed Type"{0}),2)
                              & List.Transform(List.Skip(Record.ToList(#"Changed Type"{0}),2),
                                               each DateTime.ToText(_,"yyyy/M/d")
                                )
                    })
    )

↓完成図(突然小さくてすみません)