如何使用Power Query查找替换值 区分两类地址邮编字段
Power Query 双邮编字段拆分方案
最优方案:分组前提前标记字段,从根源避免邮编合并
不要在分组阶段对所有行无差别使用Text.Combine,先给从PDF提取的原始行数据做字段标记,再按标记分组,完全不会出现邮编混同问题:
- 遍历原始提取表的每一行,识别「注册地址」「经营地址」两个字段的位置
- 将「注册地址」行之后、下一个非邮编字段之前的邮编行,标记为
注册地址邮编 - 将「经营地址」行之后、下一个非邮编字段之前的邮编行,标记为
经营地址邮编 - 后续分组时按标记的字段名聚合,两个邮编会自动分到独立列
标记步骤参考M代码:
#"新增行索引" = Table.AddIndexColumn(原始提取表, "行号", 0, 1, Int64.Type), #"标记地址位置" = Table.AddColumn(#"新增行索引", "字段名", each let 之前的所有字段 = List.FirstN(#"新增行索引"[字段原始名], [行号]), 最近的地址字段 = List.Last(List.Select(之前的所有字段, each _ = "注册地址" or _ = "经营地址")) in if [字段原始名] = "邮编" then 最近的地址字段 & "邮编" else [字段原始名] )
后续直接按「字段名」列分组透视即可得到独立的两个邮编列。
兜底方案:已合并邮编的快速拆分
如果你已经完成分组操作,拿到了两个邮编拼接后的字符串,可以利用中国邮编固定为6位纯数字的规则直接拆分,容错率远高于按固定分隔符拆分:
- 先在Power Query里定义通用的6位数字提取自定义函数
- 对合并后的邮编列调用函数,固定提取出2个6位数字
- 按地址顺序将第一个提取值赋给「注册地址邮编」,第二个赋给「经营地址邮编」
参考实现代码:
// 自定义函数:提取文本中所有6位连续数字 提取6位邮编 = (源文本 as text) as list => let 正则匹配 = Regex.Matches(源文本, "\d{6}"), 结果列表 = List.Transform(正则匹配, each _.Value) in 结果列表, #"拆分邮编" = Table.AddColumn(已分组表, "邮编列表", each 提取6位邮编([合并后的邮编列])), #"展开注册邮编" = Table.AddColumn(#"拆分邮编", "注册地址邮编", each [邮编列表]{0}?), #"展开经营邮编" = Table.AddColumn(#"展开注册邮编", "经营地址邮编", each [邮编列表]{1}?), #"移除临时列" = Table.RemoveColumns(#"展开经营邮编",{"邮编列表"})
批量处理注意事项
- 批量跑3000个PDF前,先加校验步骤:筛选出提取到的邮编数量不等于2的行,单独人工核对,避免因个别PDF格式错乱导致脏数据
- 批量逻辑建议把文件遍历、PDF转文本的步骤放在VBA里实现,文本结构化、字段拆分的逻辑全部放在Power Query模板里,比纯VBA写文本处理的维护成本低很多
内容的提问来源于stack exchange,提问作者Nabillah Jizad
相关产品推荐
相关产品推荐

