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

如何在SAS(EG与Viya)中循环调用API实现企业地理编码

巴西CEP地理编码:整合BrasilAPI返回结果到SAS数据集

问题背景

现有SAS数据集AMOSTRA_ENTIDADE,包含企业编码、名称及巴西邮政编码(CEP)字段,需通过BrasilAPI的CEP接口获取对应地理信息(经纬度、街道、行政区等),并将这些信息合并到原数据集中。此前尝试宏循环调用PROC HTTP仅能输出JSON内容,无法实现数据整合,需兼容SAS Enterprise Guide和SAS Viya的可运行代码。

样本数据集代码

data AMOSTRA_ENTIDADE;
infile datalines delimiter=',';
length CODEMPRESA 3. 
       NOMEEMPRESA $9
       CEP $8;
input CODEMPRESA NOMEEMPRESA $ CEP;
datalines;
1,EMPRESA A,71577090
2,EMPRESA B,01026010
10,EMPRESA C,01000000
100,EMPRESA D,92300000
110,EMPRESA E,29010580
;
run;

解决方案代码

/* 定义获取CEP地理信息的宏:输入CEP,输出包含地理信息的临时数据集 */
%macro get_cep_info(cep, out_ds);
    filename resp temp;
    
    /* 调用BrasilAPI的CEP v2接口 */
    proc http
        url = "https://brasilapi.com.br/api/cep/v2/&cep."
        method = get
        out = resp
        clear_cache;
    run;
    
    /* 解析JSON响应到SAS数据集 */
    libname resp json;
    
    /* 提取所需地理字段,处理API返回结构 */
    data &out_ds.;
        length cep $8 lat $20 lon $20 logradouro $100 bairro $50 cidade $50 uf $2;
        set resp.root;
        cep = "&cep.";
        /* 映射JSON嵌套字段到SAS变量 */
        lat = geolocation.latitude;
        lon = geolocation.longitude;
        logradouro = street;
        bairro = neighborhood;
        cidade = city.name;
        uf = state;
        keep cep lat lon logradouro bairro cidade uf;
    run;
    
    /* 清理临时资源 */
    libname resp clear;
    filename resp clear;
%mend get_cep_info;

/* 主数据步:遍历原数据集,调用API并合并结果 */
data COORDENADAS_ENTIDADE;
    set AMOSTRA_ENTIDADE;
    /* 定义新增地理字段的长度 */
    length lat $20 lon $20 logradouro $100 bairro $50 cidade $50 uf $2;
    /* 初始化字段为空,避免残留值 */
    call missing(lat, lon, logradouro, bairro, cidade, uf);
    
    /* 同步调用宏,获取当前CEP的地理信息 */
    rc = dosubl('%get_cep_info('||CEP||', temp_cep)');
    
    /* 读取临时表的结果到当前观测 */
    if rc = 0 then do;
        set temp_cep;
    end;
    else do;
        put "WARNING: CEP " CEP " 请求失败,返回码 " rc;
    end;
    
    /* 删除临时表,避免下一次迭代冲突 */
    rc = delete('work.temp_cep');
run;

/* 查看最终合并结果 */
proc print data=COORDENADAS_ENTIDADE;
run;

关键改进说明

  • 宏输出数据集:宏get_cep_info新增输出数据集参数,将解析后的JSON结果存储为临时表,方便主数据步直接读取关联
  • 同步执行:使用dosubl函数同步执行宏,确保API请求完成后再读取结果,解决异步调用导致的数据不匹配问题
  • 错误处理:通过dosubl返回码判断API请求是否成功,对失败的CEP输出警告信息
  • 字段定义:显式定义所有地理字段的长度,避免字符串截断或类型不兼容问题
  • 资源清理:每次调用后清理JSON库和临时文件,防止资源占用或冲突

内容的提问来源于stack exchange,提问作者rmartins

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:01:11