Power Query:基于文本参数指定的列名过滤空值行的实现方法
Power Query:基于文本参数指定的列名过滤空值行的实现方法
嗨,我来帮你搞定这个问题!你碰到的核心卡点是如何用文本参数动态引用列名来过滤空值行,之前的两次尝试没成功,原因其实很容易理解:
- 第一次用
[FilterColumn]的时候,Power Query会直接去找名为FilterColumn的列,但你的数据源里根本没有这个列,所以报错是必然的; - 第二次直接写
FilterColumn,Power Query是在判断参数本身的值是否为空,而不是参数指定的那列的内容,自然不会过滤任何行。
下面给你两种简单可靠的实现方式,都能完美解决你的需求:
方法一:用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}}), #"Filtered Rows" = Table.SelectRows(#"Changed Type", each Record.Field(_, FilterColumn) <> null and Record.Field(_, FilterColumn) <> "" // 如果不需要过滤空字符串,可以删掉这部分 ) in #"Filtered Rows"
代码解释:
_代表当前遍历到的行记录;Record.Field(_, FilterColumn)会根据你设置的FilterColumn参数,动态获取当前行对应列的值;- 后面的判断条件会过滤掉该列值为空(null)或空字符串的行,完全符合你的需求。
方法二:用Table.Column结合位置索引(备选)
如果你偏好另一种思路,可以先获取目标列的位置索引,再通过索引来引用列值:
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}}), ColumnIndex = List.PositionOf(Table.ColumnNames(#"Changed Type"), FilterColumn), #"Filtered Rows" = Table.SelectRows(#"Changed Type", each Record.FieldValues(_){ColumnIndex} <> null and Record.FieldValues(_){ColumnIndex} <> "" ) in #"Filtered Rows"
这个方法先通过List.PositionOf找到目标列在表头中的位置,再用Record.FieldValues(_){ColumnIndex}获取对应位置的列值,效果和第一种方法一致,只是实现思路不同。
当你把FilterColumn设为Col3时,两种方法都会自动过滤掉Col3为空的Parakeet那一行,得到你想要的结果~
备注:内容来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

