【问题标题】:Split data grouped within cells from multiple columns into rows using Power Query Editor使用 Power Query 编辑器将单元格内分组的数据从多列拆分为行
【发布时间】:2021-03-08 10:32:39
【问题描述】:

类似于我发布的一个初学者问题:Split values in cell into columns and rows

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

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

【问题讨论】:

    标签: excel excel-formula formatting office365 powerquery


    【解决方案1】:

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

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

    • 可以使用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
    

    【讨论】:

    • 你好,是的,我目前正在关注这个视频youtube.com/watch?v=V5X-wo0wVw0,我认为这就是你的建议?但是我遇到了一个错误,我们无法将类型记录的值转换为我无法绕过的类型文本。
    • @Nick 我对视频一无所知。但是,如您所见,我提供的 M 代码与您提供的数据配合得很好。我会确保它适用于你的机器。然后探索差异。
    【解决方案2】:

    下面试试

    关键在于添加的自定义列在换行时拆分为列表,然后将这些列表组合成一个可以扩展为行的表格。为了使空值处理更容易,我将空值转换为文本空值,然后返回到末尾

    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"
    

    【讨论】:

      【解决方案3】:

      https://www.youtube.com/watch?v=V5X-wo0wVw0这个视频清楚地解释了如何做到这一点。

      【讨论】:

        猜你喜欢
        • 2020-09-03
        • 2022-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多