Power Query技术问询:从多查找表匹配提取并清理内容
Power Query多维度数据拆分方案(基于Lookup表匹配)
一、新手友好的分步实现
1. 准备Lookup表
把所有Lookup_n表导入Power Query,给每个表起清晰的名字(比如Lookup_产品、Lookup_地区),确保每个表只有一列,列名对应维度(比如产品、地区)。
2. 编写通用匹配删除函数
这个函数能一次性完成「匹配Lookup值+从原文本移除」的操作,不用重复写代码:
进入Power Query编辑器,点击「主页」→「高级编辑器」,直接替换成以下代码:
// 函数名:MatchAndRemove (LookupTable as table, LookupColumn as text, InputText as text) as record => let // 缓存Lookup值列表,大数据场景下提速 LookupList = List.Buffer(LookupTable[LookupColumn]), // 找出原文本中第一个匹配的Lookup值 MatchedValue = List.First(List.Select(LookupList, each Text.Contains(InputText, _))), // 移除匹配值,得到剩余文本 RemainingText = if MatchedValue <> null then Text.Replace(InputText, MatchedValue, "") else InputText in [匹配值 = MatchedValue, 剩余文本 = RemainingText]
注意:如果同一维度有短/长匹配值(比如「苹果」和「苹果手机」),要把长值放在Lookup表最前面,避免短值先被匹配导致长值漏判。
3. 给主表拆分维度列
回到你的主数据集(比如命名为主数据):
- 处理第一个维度:点击「添加列」→「自定义列」,输入公式
MatchAndRemove(Lookup_产品, "产品", [Column_1]),回车后生成包含「匹配值」和「剩余文本」的记录列。点击列名右侧的展开箭头,只选择「匹配值」,将新列重命名为「产品」。 - 处理第二个维度:再次添加自定义列,用刚生成的「剩余文本」作为输入,公式改为
MatchAndRemove(Lookup_地区, "地区", [剩余文本]),同样展开「匹配值」并重命名为「地区」,保留新的「剩余文本」。 - 重复上述操作直到所有维度处理完成,最后把最终的「剩余文本」重命名为
Column_1替换原列,临时剩余文本列可直接删除。
4. 处理无匹配场景
如果部分行未匹配到某个维度的值,对应新列会显示null,可以用「替换值」功能将null改为空文本或你需要的默认值。
二、大数据集优化方案
如果数据集规模极大,分步操作效率偏低,可尝试批量处理:
- 将所有Lookup表合并为一张「维度映射表」,结构如下:
| 维度名称 | 匹配值 |
|---|---|
| 产品 | 手机 |
| 产品 | 电脑 |
| 地区 | 北京 |
| 地区 | 上海 |
- 编写批量匹配函数,一次性遍历所有维度完成匹配和文本移除。该方法稍复杂,建议先掌握基础方法后再尝试。
内容的提问来源于stack exchange,提问作者bjd
相关产品推荐
相关产品推荐

