问题描述
我希望清理一个我一直致力于删除复杂公式并选择使用 PQE 对我的数据进行排序的表格。
下面是我正在处理的数据的一个合成示例。
我希望输出列在材料和子值之间交替,类似于书中的标题和子标题。
到目前为止的 M 代码:
let
Source = Excel.CurrentWorkbook(){[Name="Table3"]}[Content],#"Changed Type" = Table.TransformColumnTypes(Source,{{"Material ",type text},{"Sub ",{"CAS",type text}}),#"Trimmed Text" = Table.TransformColumns(#"Changed Type",Text.Trim,#"Cleaned Text" = Table.TransformColumns(#"Trimmed Text",{{"Sub ",Text.Clean,#"Replaced Value" = Table.ReplaceValue(#"Cleaned Text","-","",Replacer.ReplaceText,{"Sub "}),#"Merged Columns" = Table.CombineColumns(#"Replaced Value",{"Material ","Sub "},Combiner.CombineTextByDelimiter(" ",QuoteStyle.None),"Merged"),#"Split Column by Delimiter" = Table.ExpandListColumn(Table.TransformColumns(#"Merged Columns",{{"Merged",Splitter.SplitTextByDelimiter(" ",QuoteStyle.Csv),let itemType = (type nullable text) Meta [Serialized.Text = true] in type {itemType}}}),#"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter",type text}})
in
#"Changed Type1"
这段代码的问题在于它在组合时没有正确列出材料,我也不知道如何正确排序 CAS 编号。
如果有人对如何实现所需的输出有任何想法,我们将不胜感激。
解决方法
您可以使用我在上一个类似问题中向您展示的相同技术从您的输入中获取输出。
- 创建两个列列表;然后
List.Zip
将它们组合起来。 - 诀窍是对于列表 1(例如输出列 1),您可能需要在子列列表的顶部添加 Material 列的内容(或者替换
-
是;并且,如果是这种情况,请在-
列表的开头添加一个CAS
;这样事情就会排在最后。
M 代码
let
Source = Excel.CurrentWorkbook(){[Name="Table13"]}[Content],#"Changed Type" = Table.TransformColumnTypes(Source,{{"Material",type text},{"Sub",{"CAS",type text}}),//combine the columns
#"Added Custom" = Table.AddColumn(#"Changed Type","Custom",each
let
L1 = if [Sub] = "-" then {[Material]}
else List.Combine({{[Material]},Text.Split([Sub],"#(lf)")}),L2 = if [Sub] = "-" then {[CAS]}
else List.Combine({{"-"},Text.Split([CAS],"#(lf)")})
in
List.Zip({L1,L2})),#"Removed Columns1" = Table.RemoveColumns(#"Added Custom",{"Material","Sub","CAS"}),//split the combined columns
#"Expanded Custom" = Table.ExpandListColumn(#"Removed Columns1","Custom"),#"Extracted Values" = Table.TransformColumns(#"Expanded Custom",{"Custom",each Text.Combine(List.Transform(_,Text.From),";"),type text}),#"Split Column by Delimiter" = Table.SplitColumn(#"Extracted Values",Splitter.SplitTextByDelimiter(";",QuoteStyle.Csv),"CAS"})
in
#"Split Column by Delimiter"