我正在 Microsoft 365 的 Excel 中使用 Power Query。
这是我的源数据表(其表名是来源):
列1 | Col2 | Col3 | Col4 | 姓名 | 替代名称 |
---|---|---|---|---|---|
11 | 21 | 31 | 41 | 狗 | 菲多 |
12 | 22 | 三十二 | 四十二 | 猫 | 蓬松的 |
23 | 33 | 43 | 鸵鸟 | 简 | |
14 | 24 | 四十四 | 长尾小鹦鹉 | 鲍勃 | |
15 | 二十五 | 三十五 | 四十五 | 鳟鱼 | 辛迪 |
我定义了两个文本参数:
ColToKeep
指定哪个一要保留的列Col1
、Col2
、Col3
和Col4
。未指定的列将被丢弃。NameToKeep
Name
指定要保留的列Alt.Name
。未指定的列将被丢弃。
我的目标是开发一个 Power Query 来:
ColToKeep
删除除和指定的两列之外的所有列NameToKeep
- 过滤掉包含无效的在指定的列中
ColToKeep
假设我设置ColToKeep
为Col3假设我设置NameToKeep
为替代名称,期望的结果是:
Col3 | 替代名称 |
---|---|
31 | 菲多 |
三十二 | 蓬松的 |
33 | 简 |
三十五 | 辛迪 |
然而,实际(不正确)结果是:
Col3 | 替代名称 |
---|---|
31 | 菲多 |
三十二 | 蓬松的 |
33 | 简 |
鲍勃 | |
三十五 | 辛迪 |
这是我的 Power Query 的 M 语言代码:
let
Source = Excel.CurrentWorkbook(){[Name="Source"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Col1", Int64.Type}, {"Col2", Int64.Type}, {"Col3", Int64.Type}, {"Col4", Int64.Type}, {"Name", Text.Type}, {"Alt.Name", Text.Type}}),
#"Removed Other Columns" = Table.SelectColumns(#"Changed Type",{ColToKeep, NameToKeep}),
// #"Filtered Rows" = Table.SelectRows(#"Removed Other Columns", each [ColToKeep] <> null and [ColToKeep] <> "")
// #"Filtered Rows" = Table.SelectRows(#"Removed Other Columns", each ColToKeep <> null and ColToKeep <> "")
// #"Filtered Rows" = Table.SelectRows(#"Removed Other Columns", each Table.ColumnNames(#"Removed Other Columns"){0} <> null and Table.ColumnNames(#"Removed Other Columns"){0} <> "")
in
#"Filtered Rows"
它是#“过滤行”应用步骤出错。在上面的代码中,我展示了我在实施此应用步骤时所做的三次(注释掉的)尝试。
在第一次尝试中,我只是直接引用列名(带括号)。但是,ColToKeep
和NameToKeep
被视为对感兴趣的列的引用,而不是包含列名的文本字符串。抛出错误,因为例如没有名为保存。
第二次尝试时,我再次直接引用列名,但这次没有使用括号。这不会引发错误,但我得到了上面显示的错误输出。
在第三次尝试中,我根据列的位置来引用它们,因为直到运行时我才知道哪些列被保留。在前面的#“删除了其他列”执行应用步骤后,将剩下两列。我假设它们的位置索引为 0 和 1,但我怀疑调用执行时位置索引尚未调整Table.SelectRows
,因此在过滤时我没有引用我想要的列无效的值。这不会引发错误,但会生成上面显示的错误输出。
我如何根据以下内容筛选出行无效的参数命名的列中的值ColToKeep
?
答案1
暂时将标题放到第一行,将列编号为 1 和 2,然后过滤掉空值,然后将第一行重新提升为标题:
let
Source = Excel.CurrentWorkbook(){[Name="Source"]}[Content],
#"Removed Other Columns" = Table.SelectColumns(Source,{ColToKeep, NameToKeep}),
#"Demoted Headers" = Table.DemoteHeaders(#"Removed Other Columns"),
#"Changed Type" = Table.TransformColumnTypes(#"Demoted Headers",{{"Column2", type text}}),
#"Filtered Rows" = Table.SelectRows(#"Changed Type", each ([Column1] <> null)),
#"Filtered Rows1" = Table.SelectRows(#"Filtered Rows", each [Column2] <> null),
#"Promoted Headers" = Table.PromoteHeaders(#"Filtered Rows1", [PromoteAllScalars=true])
in
#"Promoted Headers"