入出力の区別がない表の場合、一覧表形式になっていることが多い。そしてそれがシート単位で増幅されていく悪循環に陥りやすい。
それは置いといて、これを列ごとに項目がまとまったテーブル情報に組み換えしたい時。横並びのデータが1種類だったら列のピボット解除一本で解決できる。ただ2列一組や3列一組となってくると単純にはいかない。
例えば、最初の一列だけが例外の2列一組のテーブル(テーブル1)だった場合どうするか。
まずは一般的とされる方法から。左端の「氏名」列以外を選択して列のピボット解除を実行。
列のピボット解除 = Table.UnpivotOtherColumns( テーブル1, {"氏名"}, "属性", "値" ),
次に属性のいらない部分を列の分割で取り除く。今回は後ろの数字だけ除去する。
列の分割 = Table.SplitColumn( 列のピボット解除, "属性", Splitter.SplitTextByCharacterTransition( (c) => not List.Contains({"0".."9"}, c), {"0".."9"} ), {"属性"} ),
続いて例によって行のグループ化+連番列挿入。
行のグループ化 = Table.Group(列の分割, {"氏名", "属性"}, { "テーブル", each Table.AddIndexColumn(_, "連番", 1, 1), type table [氏名=text, 属性=text, 値=any, 連番=number] }),
テーブル列以外を削除してから、列を展開。
不要列の削除 = Table.RemoveColumns(
行のグループ化,{"氏名", "属性"}
),
テーブル列の展開 = Table.ExpandTableColumn(
不要列の削除, "テーブル", {"氏名", "属性", "値", "連番"}
),
列のピボット(集計しない)を実行して、連番列を削除。
列のピボット = Table.Pivot( テーブル列の展開, List.Distinct(テーブル列の展開[属性]), "属性", "値" ), 連番列の削除 = Table.RemoveColumns(列のピボット,{"連番"})
というのが一応のパターンなんだけども(長かった)。Table.Splitを使ってやれば、列のピボット解除から先の展開が楽になる。
列のピボット解除 = Table.UnpivotOtherColumns(
テーブル1, {"氏名"}, "属性", "値"
),
テーブル分割 = Table.Split(列のピボット解除, 2),
リスト編集 = List.Transform(テーブル分割, each
Table.FromRows(
{{[氏名]{0}} & [値]},
type table [氏名=text, 品目=text, 数量=number]
)
),
テーブル結合 = Table.Combine(リスト編集)
リストを編集したり、リストからテーブルを作成したりするのには、多少慣れが必要だとは思う。ただどうせ避けては通れない道なんだし、必要を感じた時が勉強のタイミングではないかな。