在 Power Query 中执行转置之前合并行?
Merge rows before executing transpose in Power Query?
我需要将这些项目描述行合并成一行,这样每条记录的行数就会保持一致,这样我就可以通过 Power Query 将它们转置到适当的列中。 (见图)如果记录中的行数一致,我了解如何使用 Power Query 执行转置,但如果行数不同,我无法弄清楚如何执行此操作。数据来自格式糟糕的 PDF,并将项目描述信息分成单独的行。 < 这是关键问题。除此之外,剩下的就是蛋糕了。请参阅片段以了解我的意思。
每个转置记录将有七列:
导演分析
地址
项目
区域
通知日期
项目介绍
上诉
我可以得到我需要的一切,包括 headers。我只是不知道如何合并项目描述下的行,以便我可以继续进行转置。
here is the link to view a screenshot of my sheet
这是一个拼凑,但似乎有效。假设我们要操作的列在 powerquery
中名为 column a
它会查找包含 项目描述 和 Appeals must be
的行之间的任何内容
创建一个移动的行,这样我们就可以看到上面一行的内容
添加索引
根据第一列和移位后的第一列,使用自定义列来确定哪些行需要过滤掉,哪些行是要合并的开始行和结束行
根据该信息将文本合并在一起,将其合并回原始 table,然后删除多余的行
let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
// create shifted row
shiftedList = {null} & List.RemoveLastN(Source[a],1),
custom3 = Table.ToColumns(Source) & {shiftedList},
custom4 = Table.FromColumns(custom3,Table.ColumnNames(Source) & {"Next Row Header"}),
#"Added Index" = Table.AddIndexColumn(custom4, "Index", 0, 1, Int64.Type),
#"Added Custom" = Table.AddColumn(#"Added Index", "Custom", each try if Text.Contains([Next Row Header],"Project Description" ) then [Index] else if Text.Contains([a],"Appeals must be") then [Index] else null otherwise 0),
#"Filled Down" = Table.FillDown(#"Added Custom",{"Custom"}),
#"Added Custom1" = Table.AddColumn(#"Filled Down", "Custom.1", each try if Text.Contains([Next Row Header],"Project Desc") then "remove" else if Text.Contains([a],"Appeals must be") then "keep" else null otherwise "keep"),
#"Filled Down1" = Table.FillDown(#"Added Custom1",{"Custom.1"}),
#"Filtered Rows1" = Table.SelectRows(#"Filled Down1", each ([Custom.1] = "remove")),
#"Grouped Rows1" = Table.Group(#"Filtered Rows1", {"Custom"}, {{"Count", each Text.Combine(List.Transform([a], Text.From), ","), type text}}),
#"Merged Queries" = Table.NestedJoin(#"Filled Down1", {"Index"}, #"Grouped Rows1", {"Custom"}, "Table2", JoinKind.LeftOuter),
#"Expanded Table2" = Table.ExpandTableColumn(#"Merged Queries", "Table2", {"Count"}, {"Count"}),
#"SwapValue"= Table.ReplaceValue( #"Expanded Table2", each [Custom.1], each if [Count] = null then [Custom.1] else "keep", Replacer.ReplaceValue,{"Custom.1"}),
#"Final Swap"=Table.ReplaceValue(#"SwapValue",each [a], each if [Count]=null then [a] else [Count] , Replacer.ReplaceValue,{"a"}),
#"Filtered Rows" = Table.SelectRows(#"Final Swap", each ([Custom.1] = "keep")),
#"Removed Columns" = Table.RemoveColumns(#"Filtered Rows",{"Next Row Header", "Index", "Custom", "Custom.1", "Count"})
in #"Removed Columns"
我需要将这些项目描述行合并成一行,这样每条记录的行数就会保持一致,这样我就可以通过 Power Query 将它们转置到适当的列中。 (见图)如果记录中的行数一致,我了解如何使用 Power Query 执行转置,但如果行数不同,我无法弄清楚如何执行此操作。数据来自格式糟糕的 PDF,并将项目描述信息分成单独的行。 < 这是关键问题。除此之外,剩下的就是蛋糕了。请参阅片段以了解我的意思。
每个转置记录将有七列: 导演分析 地址 项目 区域 通知日期 项目介绍 上诉
我可以得到我需要的一切,包括 headers。我只是不知道如何合并项目描述下的行,以便我可以继续进行转置。 here is the link to view a screenshot of my sheet
这是一个拼凑,但似乎有效。假设我们要操作的列在 powerquery
中名为 column a它会查找包含 项目描述 和 Appeals must be
的行之间的任何内容创建一个移动的行,这样我们就可以看到上面一行的内容
添加索引
根据第一列和移位后的第一列,使用自定义列来确定哪些行需要过滤掉,哪些行是要合并的开始行和结束行
根据该信息将文本合并在一起,将其合并回原始 table,然后删除多余的行
let Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
// create shifted row
shiftedList = {null} & List.RemoveLastN(Source[a],1),
custom3 = Table.ToColumns(Source) & {shiftedList},
custom4 = Table.FromColumns(custom3,Table.ColumnNames(Source) & {"Next Row Header"}),
#"Added Index" = Table.AddIndexColumn(custom4, "Index", 0, 1, Int64.Type),
#"Added Custom" = Table.AddColumn(#"Added Index", "Custom", each try if Text.Contains([Next Row Header],"Project Description" ) then [Index] else if Text.Contains([a],"Appeals must be") then [Index] else null otherwise 0),
#"Filled Down" = Table.FillDown(#"Added Custom",{"Custom"}),
#"Added Custom1" = Table.AddColumn(#"Filled Down", "Custom.1", each try if Text.Contains([Next Row Header],"Project Desc") then "remove" else if Text.Contains([a],"Appeals must be") then "keep" else null otherwise "keep"),
#"Filled Down1" = Table.FillDown(#"Added Custom1",{"Custom.1"}),
#"Filtered Rows1" = Table.SelectRows(#"Filled Down1", each ([Custom.1] = "remove")),
#"Grouped Rows1" = Table.Group(#"Filtered Rows1", {"Custom"}, {{"Count", each Text.Combine(List.Transform([a], Text.From), ","), type text}}),
#"Merged Queries" = Table.NestedJoin(#"Filled Down1", {"Index"}, #"Grouped Rows1", {"Custom"}, "Table2", JoinKind.LeftOuter),
#"Expanded Table2" = Table.ExpandTableColumn(#"Merged Queries", "Table2", {"Count"}, {"Count"}),
#"SwapValue"= Table.ReplaceValue( #"Expanded Table2", each [Custom.1], each if [Count] = null then [Custom.1] else "keep", Replacer.ReplaceValue,{"Custom.1"}),
#"Final Swap"=Table.ReplaceValue(#"SwapValue",each [a], each if [Count]=null then [a] else [Count] , Replacer.ReplaceValue,{"a"}),
#"Filtered Rows" = Table.SelectRows(#"Final Swap", each ([Custom.1] = "keep")),
#"Removed Columns" = Table.RemoveColumns(#"Filtered Rows",{"Next Row Header", "Index", "Custom", "Custom.1", "Count"})
in #"Removed Columns"