You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 06:27:02