我在 Excel for Microsoft 365 中使用 Power Query。
这是我的源数据表(其表名为Source):
第 1 列 | 第2栏 | 第3栏 | 第4栏 | 姓名 | 替代名称 |
---|---|---|---|---|---|
11 | 21 | 31 | 41 | 狗 | 菲多 |
12 | 22 | 32 | 42 | 猫 | 蓬松的 |
23 | 33 | 43 | 鸵鸟 | 扬 | |
14 | 24 | 44 | 长尾小鹦鹉 | 鲍勃 | |
15 | 25 | 35 | 45 | 鳟鱼 | 辛迪 |
我定义了两个文本参数:
ColToKeep
指定保留、、和中的哪一列。未指定的列将被丢弃。Col1
Col2
Col3
Col4
NameToKeep
指定要保留哪一列Name
和。Alt.Name
未指定的列将被丢弃。
我的目标是开发 Power Query 来:
ColToKeep
删除除和指定的两列之外的所有列NameToKeep
- 过滤掉由指定的列中存在空值的行
ColToKeep
假设我设置ColToKeep
为Col3并假设我设置NameToKeep
为Alt.Name,所需的结果是:
第3栏 | 替代名称 |
---|---|
31 | 菲多 |
32 | 蓬松的 |
33 | 扬 |
35 | 辛迪 |
然而,实际(不正确)的结果是:
第3栏 | 替代名称 |
---|---|
31 | 菲多 |
32 | 蓬松的 |
33 | 扬 |
鲍勃 | |
35 | 辛迪 |
这是我的 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"
这是#"Filtered Rows"应用步骤出了问题。在上面的代码中,我展示了我在实现此应用步骤时所做的三个(注释掉的)尝试。
在第一次尝试中,我只是直接引用列名称(带括号)。但是,ColToKeep
和NameToKeep
被视为对感兴趣的列的引用,而不是作为保存列名称的文本字符串。抛出错误是因为,例如,没有名为ColToKeep的列。
在第二次尝试中,我再次直接引用列名称,但这次没有括号。这不会引发错误,但我得到上面显示的不正确的输出。
在第三次尝试中,我按列的位置引用这些列,因为直到运行时我才知道要保留哪些列。执行前面的#“删除其他列”应用步骤后,将剩下两列。我假设它们的位置索引将为 0 和 1,但我怀疑在调用执行时位置索引尚未调整Table.SelectRows
,因此我在过滤空值时没有引用我想要的列。这不会引发错误,但会生成上面所示的不正确输出。
如何根据参数指定的列中的空ColToKeep
值过滤掉行?
暂时将标题放到第一行,这会将列编号为 1 和 2,然后过滤掉空值,然后将第一行重新提升为标题: