如何在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
相关产品推荐
相关产品推荐

