Power Query中如何实现文本非精确匹配查询?
Power Query 筛选包含"1 EA"文本的列
现有精确匹配公式
我目前有一个能精确匹配"1 EA"的Power Query公式:
= List.Select(ColumnNames, each List.Contains(Table.Column(#"Filled Down",_),"1 EA"))
需求与尝试的无效公式
现在需要修改公式,使其能筛选出列中存在包含"1 EA"文本的列(即文本前后有其他内容或空格时仍判定为匹配)。我尝试了两个公式都不符合预期:
- 第一个公式:
该公式报错(无具体错误描述),且仅返回包含精确"1 EA"的单个列名;= List.Select(ColumnNames, each List.AnyTrue(List.Transform(Table.Column(#"Filled Down", _), each Text.Contains(_, "1 EA")))) - 第二个公式:
该公式返回空列表,完全不符合需求。= List.Select(ColumnNames, each List.Contains(Table.Column(#"Filled Down", _), each Text.Contains(_, "1 EA")))
测试数据
我的测试数据如下,期望返回的列列表为Data.Column1、Data.Column2和Data.Column4:
| Data.Column1 | Data.Column2 | Data.Column3 | Data.Column4 |
|---|---|---|---|
| Sample Text | 1 EAsdd | Sample text | 1 EA |
| 1 EA | Sample text | Sample Text | 1 EAff |
正确解决方案
有效公式
使用以下公式可以实现需求:
= List.Select(ColumnNames, each List.AnyTrue(List.Transform(Table.Column(#"Filled Down", _), (textValue) => Text.Contains(textValue, "1 EA"))))
公式说明
List.Transform遍历目标列的每一个文本值,用Text.Contains(textValue, "1 EA")检查当前值是否包含"1 EA",返回一个布尔值列表;List.AnyTrue判断布尔列表中是否存在至少一个true,即该列中存在符合条件的值;- 外层
List.Select据此筛选出所有符合条件的列名。
之前公式的问题分析
- 第一个公式的问题:嵌套的
each表达式存在上下文变量冲突,改用具名参数(如textValue)替代each即可避免; - 第二个公式的问题:
List.Contains的第二个参数需要是具体值,而非条件表达式,因此用each Text.Contains(...)作为参数完全不符合该函数的使用逻辑,导致返回空列表。
内容的提问来源于stack exchange,提问作者Anushka A
相关产品推荐
相关产品推荐

