我有一个这样的表的要求-
具有2列的实际表格
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列,而离开第2列。
我需要使用查询编辑器将转换后的表作为新表。
这是我的预期输出,
具有4列的OutTable
基本上,列值由定界符$$顺序标识,如果column2说有新行,则它是一条新记录,否则,它必须转到当前行并附加为新列值。
如何在查询编辑器中将输入表转换为该输出表?
最终输出的数据类型无关紧要。
第一步是将“上一行”中的行值带入 带有分隔符的新行,并将其作为单行。
答案 0 :(得分:2)
此处的关键是创建一个分组列,该分组列将每一行分配为其最终的输出行号。您可以通过在Column2
中用“新行”查找最后一行的索引来完成此操作。
首先,创建一个索引列(在“添加列”标签下)。
现在,您可以如上所述通过获取最大索引来创建分组定制列。公式可能看起来像这样:
List.Max(
Table.SelectRows(#"Prev Step Name",
(here) => [Index] >= here[Index] and here[Column2] = "New Row"
)[Index]
)
您的表格现在应如下所示:
现在,我们使用“分组依据”(在“首页”标签下),按Group
列进行分组,并在Column1
上进行汇总。
但是我们将汇总从List.Max
更改为Text.Combine
,以便此步骤的代码为
= Table.Group(#"Added Custom", {"Group"},
{{"Concat", each Text.Combine([Column1]," "), type text}})
现在表格应如下所示:
在这里,您可以使用" && "
作为分隔符(在“主页”选项卡下)按分隔符进行分隔列。
根据需要更改任何列名,如果不再需要Group
列,则结果应为所需的输出。
整个查询的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"