使用 Power Query 编辑器将单元格内分组的数据从多列拆分为行

Split data grouped within cells from multiple columns into rows using Power Query Editor

类似于我发布的初学者问题:

当尝试对多列实现相同的效果时,高级查询编辑器可以根据需要拆分一列,但对于另一列,将拆分的所有值复制到每个新行中(如图所示)。这是有道理的,但我想知道是否可以按照所需结果所示相应地拆分数据。

我找到了解决此问题的方法,方法是对要拆分的每一列重复 PQE 练习两次,然后移动输出的列,使它们相邻。然而,这似乎是实现这一目标的低效方法。 power query 能否根据需要拆分两列而无需执行两次?

我建议先合并列;然后进行拆分。

但是当您合并列时,您需要逐行执行此操作以将所有内容放在同一行上。

  • 可以使用 Text.Split 函数创建每个单元格内容的列表。
  • 然后可以使用 List.Zip 函数合并两个列表。
  • 最后,我们把他们分开了。

我使用自定义列来创建联接列表。您可以通过单击 Added Custom 应用的步骤来查看公式。

M码

let
    Source = Excel.CurrentWorkbook(){[Name="Table6"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Material", type text}, {"Sub", type text}, {"CAS", type text}}),
    
    //combine the two columns
    #"Added Custom" = Table.AddColumn(#"Changed Type", "list", each List.Zip({
            Text.Split([Sub],"#(lf)"),
            Text.Split([CAS],"#(lf)")
            })),
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Sub", "CAS"}),

    //Expand the list and split into rows
    #"Expanded list" = Table.ExpandListColumn(#"Removed Columns", "list"),
    #"Extracted Values" = Table.TransformColumns(#"Expanded list", {"list", each Text.Combine(List.Transform(_, Text.From), ";"), type text}),
    #"Split Column by Delimiter" = Table.SplitColumn(#"Extracted Values", "list", Splitter.SplitTextByDelimiter(";", QuoteStyle.Csv), {"list.1", "list.2"}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"list.1", type text}, {"list.2", type text}}),

    //Rename the splitted columns
    renamed = Table.RenameColumns(#"Changed Type1",List.Zip({Table.ColumnNames(#"Changed Type1"),Table.ColumnNames(Source)}))
    
in
    renamed

试试下面

关键在于添加的自定义列,这些列在换行时拆分为列表,然后将这些列表组合成可以扩展为行的 table。为了使 null 处理更容易,我将 null 转换为文本 null,然后在 end

处返回
let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Sub", type text}, {"CAS", type text}}),
#"Replaced Value" = Table.ReplaceValue(#"Changed Type",null,"[null]",Replacer.ReplaceValue,{"Sub", "CAS"}),
#"Added Custom" = Table.AddColumn(#"Replaced Value", "Custom", each Text.Split([Sub],"#(lf)")),
#"Added Custom1" = Table.AddColumn(#"Added Custom", "Custom.1", each Text.Split([CAS],"#(lf)")),
#"Added Custom2" = Table.AddColumn(#"Added Custom1", "Custom.2", each Table.FromColumns({[Custom],[Custom.1]})),
#"Expanded Custom.2" = Table.ExpandTableColumn(#"Added Custom2", "Custom.2", {"Column1", "Column2"}, {"Column1", "Column2"}),
#"Removed Columns" = Table.RemoveColumns(#"Expanded Custom.2",{"Sub", "CAS", "Custom", "Custom.1"}),
#"Replaced Value1" = Table.ReplaceValue(#"Removed Columns","[null]",null,Replacer.ReplaceValue,{"Column1", "Column2"})
in #"Replaced Value1"

https://www.youtube.com/watch?v=V5X-wo0wVw0该视频清楚地解释了如何执行此操作。