Power Query中如何按文本参数指定的列名过滤空值行?
Power Query中如何按文本参数指定的列名过滤空值行?
我来帮你解决这个问题,你遇到的核心问题是没搞清楚文本参数和列引用在Power Query M语言里的区别——你的ColToKeep是存储列名的文本字符串(比如"Col3"),但之前的写法要么把它当成了列名本身,要么直接用了字符串值,没有去取对应列的单元格内容。
问题根源拆解
先帮你复盘下之前三次尝试的问题:
- 第一次用
[ColToKeep]:Power Query会直接去找名为ColToKeep的列,但你的表根本没有这个列,所以报错。 - 第二次用
ColToKeep:这里取的是参数的文本值(比如"Col3"),这个字符串本身永远不会是null,所以过滤条件相当于永远为真,自然筛不掉空值行(比如Bob那行的Col3是空的,却被保留了)。 - 第三次用
Table.ColumnNames(...):你取的是列名的字符串,同样不是单元格里的实际值,判断字符串是否为空毫无意义,所以也达不到过滤效果。
正确的解决方法
要通过文本参数指定的列来过滤空值,你需要用Record.Field函数——在Table.SelectRows的each表达式里,当前行是一个Record(记录),Record.Field(_, 列名字符串)可以精准获取当前行中指定列的值。
修正后的完整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}), // 核心修正:用Record.Field获取参数指定列的当前行值,判断是否不为null #"Filtered Rows" = Table.SelectRows(#"Removed Other Columns", each Record.Field(_, ColToKeep) <> null) in #"Filtered Rows"
补充说明
如果你还想同时过滤掉空字符串(比如列值是""的情况),可以把过滤条件改成:
each Record.Field(_, ColToKeep) <> null and Record.Field(_, ColToKeep) <> ""
这样就能精准筛选出ColToKeep参数指定的列中不为空的行,得到你想要的结果啦。
备注:内容来源于stack exchange,提问作者Dave




