[[20220326201814]] 『PowerQueryの列の分割の分割について』(くりま) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『PowerQueryの列の分割の分割について』(くりま)

インターネットや過去ログを調べてわからなかったので質問させていただきます。

私のレベルですが、PowerQueryのデータの成形については基本的な
機能は使えるようになりましたがM言語などはまだ勉強中の初心者です。

列の分割 > 行方向に分割することで1列は分割できるのですが、
2列分割ができないので、成形したい形にすることが出来ません。

詳しい方いらっしゃいましたらご教示いただけますと幸いでございます。

元データ


注文番号 項目選択肢の項目 項目選択肢の値
A123 項目A;項目B;項目C お茶;サラダ;おにぎり
A345 項目D;項目E;項目F 林檎;みかん;バナナ

成形したいデータ


注文番号 項目選択肢の項目 項目選択肢の値
A123 項目A お茶
A123 項目B サラダ
A123 項目C おにぎり
A345 項目D 林檎
A345 項目E みかん
A345 項目F バナナ

< 使用 Excel:unknown、使用 OS:Windows10 >


じんな感じでどうですか

1)列の並べ替え
2)列のマージ
3)ピボット解除
4)列の削除
5)列の分割

(マナ) 2022/03/26(土) 20:57


早速のご回答ありがとうございます!
こんなに早く回答が来るとは思っていませんでした。
もう少しご教示いただけると幸いです。

1)列の並べ替え どの列を並べ替えするのでしょうか?

2)列のマージ 「項目選択肢の項目」と「項目選択肢の値」をマージしますか?

(くりま) 2022/03/26(土) 21:10


1)項目 値 項目 値 項目 値 の 順番
2)はい。つまり2列ずつ、3回マージします

(マナ) 2022/03/26(土) 21:16


[[列の並べ替え」でなく「列の順番の入れ替え」という表現が正しいかも

(マナ) 2022/03/26(土) 21:27


マナさん

ありがとうございます!
ご教示いただいた内容で無事、対応できました!

ただ最初の質問でできていればよかったのですが、
項目数は必ずしも3とは限らず、以下のようなケースもあるのです。
こういった場合でも対応する方法はないでしょうか。

注文番号 項目選択肢の項目 項目選択肢の値
A123 項目A;項目B;項目C お茶;サラダ;おにぎり
A345 項目D;項目E;項目F;項目G 林檎;みかん;バナナ;いちご
A567 項目D;項目E;項目F;項目G;項目A 林檎;みかん;バナナ;いちご;お茶

(くりま) 2022/03/26(土) 21:38


たぶん難しいでしょう。わたしには無理です。
そのようなケースでは、マクロを使用します。

(マナ) 2022/03/26(土) 21:57


マナさん

ご回答ありがとうございます。
やはり無理ですよね。

項目数はMAXがあるので、ご教示いただいた処理を繰り返して
対応してみます。

最後にこんなに迅速にご教示いただけるとは思っていなかったので、大変感謝してます。

(くりま) 2022/03/26(土) 22:06


 こんな感じでどうでしょう
 『項目選択肢の項目』をSplitしたListと
 『項目選択肢の値』をSplitしたListを
  List.Zipで結合すると。

 let
    ソース = Excel.CurrentWorkbook(){[Name="テーブル1"]}[Content],
    変更された型 = Table.TransformColumnTypes(ソース,{{"注文番号", type text}, {"項目選択肢の項目", type text}, {"項目選択肢の値", type text}}),
    追加されたカスタム = Table.AddColumn(変更された型, "区切った項目", each Text.Split([項目選択肢の項目],";")),
    追加されたカスタム1 = Table.AddColumn(追加されたカスタム, "区切った値", each Text.Split([項目選択肢の値],";")),
    追加されたカスタム2 = Table.AddColumn(追加されたカスタム1, "カスタム", each List.Zip({[区切った項目],[区切った値]})),
    展開されたカスタム = Table.ExpandListColumn(追加されたカスタム2, "カスタム"),
    抽出した値 = Table.TransformColumns(展開されたカスタム, {"カスタム", each Text.Combine(List.Transform(_, Text.From), ";"), type text}),
    区切り記号による列の分割 = Table.SplitColumn(抽出した値, "カスタム", Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv), {"カスタム.1", "カスタム.2"}),
    変更された型1 = Table.TransformColumnTypes(区切り記号による列の分割,{{"カスタム.1", type text}, {"カスタム.2", type text}})
 in
    変更された型1
(´・ω・`) 2022/03/27(日) 04:38

奇妙なデータだなとは思っていましたが、
元のテーブルのレイアウトを誤解していました。

(´・ω・`)さんのと較べると、スマートではありませんが
こんな感じでも。

 ・ピボット解除
 ・列の分割(行方向)
 ・グループ化
 ・グループ内で連番作成
 ・展開
 ・連番を利用して再グループ化
 ・グループ内で文字列結合
 ・列の分割

グループ化した各テーブル内で連番を作成する技は
使える場面が結構あります。

 let
    ソース = Excel.CurrentWorkbook(){[Name="テーブル1"]}[Content],
    変更された型 = Table.TransformColumnTypes(ソース,{{"注文番号", type text}, {"項目選択肢の項目", type text}, {"項目選択肢の値", type text}}),
    ピボット解除された他の列 = Table.UnpivotOtherColumns(変更された型, {"注文番号"}, "属性", "値"),
    区切り記号による列の分割 = Table.ExpandListColumn(Table.TransformColumns(ピボット解除された他の列, {{"値", Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "値"),
    グループ化された行 = Table.Group(区切り記号による列の分割, {"注文番号", "属性"}, {{"group", each _, type table [注文番号=nullable text, 属性=text, 値=nullable text]}}),
    削除された他の列 = Table.SelectColumns(グループ化された行,{"group"}),
    追加されたカスタム = Table.AddColumn(削除された他の列, "連番追加", each Table.AddIndexColumn([group],"index")),
    削除された他の列1 = Table.SelectColumns(追加されたカスタム,{"連番追加"}),
    #"展開された カスタム" = Table.ExpandTableColumn(削除された他の列1, "連番追加", {"注文番号", "属性", "値", "index"}, {"注文番号", "属性", "値", "index"}),
    グループ化された行1 = Table.Group(#"展開された カスタム", {"注文番号", "index"}, {{"group2", each _, type table [注文番号=text, 属性=text, 値=text, index=number]}}),
    追加されたカスタム1 = Table.AddColumn(グループ化された行1, "カスタム", each Text.Combine([group2][値],";")),
    削除された他の列2 = Table.SelectColumns(追加されたカスタム1,{"注文番号", "カスタム"}),
    区切り記号による列の分割1 = Table.SplitColumn(削除された他の列2, "カスタム", Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv), {"カスタム.1", "カスタム.2"}),
    変更された型1 = Table.TransformColumnTypes(区切り記号による列の分割1,{{"カスタム.1", type text}, {"カスタム.2", type text}}),
    #"名前が変更された列 " = Table.RenameColumns(変更された型1,{{"カスタム.1", "項目"}, {"カスタム.2", "値"}})
 in
    #"名前が変更された列 "

(マナ) 2022/03/27(日) 09:16


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.