首页 文章

Power Query - 从单个列到整个表的数据转换

提问于
浏览
2

我有一个要求,我有一个这样的表 -

Actual Table with 2 columns

Column1                                              Column2
ColAValue $$ ColBValue $$                            New Row
ColCValue                                            Above Row
ColCValue2                                           Above Row
$$ ColDValue                                         Above Row
ColAValue $$ ColBValue $$ ColCValue $$ ColDValue     New Row
ColAValue $$ ColBValue $$ ColCValue                  New Row
$$ ColDValue                                         Above Row

我知道要求,我会 4 columns in my dataset leaving column 2 .

我需要使用查询编辑器将转换后的表作为新表 .

这是我的预期输出,

OutTable with 4 columns

Expected Output

基本上,列值由分隔符$$按顺序标识,如果column2表示新行,则它是新记录,它必须作为新列值附加到当前行 .

如何在查询编辑器中将输入表转换为此输出表?

最终输出数据类型无关紧要 .

最初的步骤是将来自Above行的行值带到带有分隔符的New行,并将其作为单行 .

1 回答

  • 2

    这里的关键是创建一个分组列,将每行分配给它的结果输出行号 . 您可以通过在 Column2 中使用"New Row"查找最后一行的索引来执行此操作 .

    首先,创建一个索引列(在“添加列”选项卡下) .

    现在,您可以通过采用上述最大索引来创建分组自定义列 . 公式可能如下所示:

    List.Max(
        Table.SelectRows(#"Prev Step Name",
            (here) => [Index] >= here[Index] and here[Column2] = "New Row"
        )[Index]
    )
    

    你的 table 现在应该是这样的:

    Group Custom Column

    现在我们使用Group By(在Home选项卡下),按 Group 列分组并聚合 Column1 .

    Group By

    但是我们要将聚合从 List.Max 更改为 Text.Combine ,以便此步骤的代码是

    = Table.Group(#"Added Custom", {"Group"},
          {{"Concat", each Text.Combine([Column1]," "), type text}})
    

    现在表格看起来像这样:

    Concatenated

    从这里,您可以使用 " && " 作为分隔符来执行拆分列分隔符(在“主页”选项卡下) .

    根据需要更改任何列名称,如果不再需要,则删除 Group 列,结果应为您所需的输出 .

    Desired Output


    整个查询的M代码:

    let
        Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45Wcs7PcQxLzClNVVBRUQBynGAcJR0lv9RyhaD8cqVYHbA6Z7AUUNwxKb8sFVPGCEMKYqQLTn3YbVaAm6iAZgCagwhpR9OB2zWxAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [Column1 = _t, Column2 = _t]),
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", type text}, {"Column2", type text}}),
        #"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 1, 1),
        #"Reordered Columns" = Table.ReorderColumns(#"Added Index",{"Index", "Column1", "Column2"}),
        #"Added Custom" = Table.AddColumn(#"Reordered Columns", "Group", each List.Max(Table.SelectRows(#"Reordered Columns", (here) => [Index] >= here[Index] and here[Column2] = "New Row")[Index]), Int64.Type),
        #"Grouped Rows" = Table.Group(#"Added Custom", {"Group"}, {{"Concat", each Text.Combine([Column1]," "), type text}}),
        #"Split Column by Delimiter" = Table.SplitColumn(#"Grouped Rows", "Concat", Splitter.SplitTextByDelimiter(" $$ ", QuoteStyle.Csv), {"COL1", "COL2", "COL3", "COL4"}),
        #"Removed Columns" = Table.RemoveColumns(#"Split Column by Delimiter",{"Group"})
    in
        #"Removed Columns"
    

相关问题