如何在SAS中使用哈希对象实现字符模糊匹配合并?
问题根因
你当前代码只能返回精确匹配的核心原因是:只有B.Find(KEY: nameA)执行成功(也就是精确匹配到nameB)时,hash对象才会给当前PDV中的nameB变量赋值;如果匹配失败,nameB为空,后续的COMPLEV比较逻辑完全没有生效基础,更没有遍历B表所有记录做模糊校验的逻辑。
修正后可实现模糊匹配的代码
data A; infile datalines missover; length nameA $50; input nameA $ ; datalines; MICKEYMOUSE2000-01-02 DAFDUCK1990-09-23 GOOFYMAN1993-05-11 ; run; *第二份数据集,包含1条精确匹配、2条与A表略有差异的记录; data B; infile datalines missover; length nameB $50; input nameB $ VDAY :ddmmyy10.; format VDAY ddmmyy10.; datalines; MICKEYMOUSE2000-01-01 07/08/2021 DAFFYDUCK1990-09-23 05/11/2021 GOOFYMAN1993-05-11 08/11/2021 ; run; data fuzzy_merge; if 0 then set work.B; /* 声明哈希对象和迭代器,用于遍历B表所有记录 */ if _n_ = 1 then do; dcl hash B(dataset: 'work.B'); B.definekey('nameB'); B.definedata('nameB','vday'); B.definedone(); dcl hiter iterB('B'); * 哈希迭代器,用于遍历全部条目; end; set work.A; /* 遍历B表所有记录,逐一做模糊匹配校验 */ rc = iterB.first(); do while(rc = 0); if complev(nameA, nameB, 'i') < 10 then do; * 'i'参数代表忽略大小写,可按需删除; output; end; rc = iterB.next(); end; drop rc; run;
逻辑说明
- 新增哈希迭代器
hiter,对A表的每一条nameA,都会遍历B表的所有条目计算COMPLEV得分 - 得分低于10的记录直接输出,精确匹配场景下COMPLEV得分为0,会自动被包含在结果中
- 如果你需要处理一对多匹配的去重需求,可以在输出前加对应判断逻辑,或者后续用
PROC SORT NODUPKEY处理 - 大数据量下如果要优化性能,可以先对name字段做前缀拆分,先按前缀做精确匹配缩小遍历范围,再做COMPLEV校验,可大幅降低计算量
内容的提问来源于stack exchange,提问作者Cymone Gates
相关产品推荐
相关产品推荐

