上一篇
场景引入:
小张最近接手了一个医疗数据集,患者姓名里混着"张三_N/A"、"李四(已出院)"这样的乱码,领导要求他三天内清洗干净,看着Excel里几百行数据,他差点把键盘摔了——直到同事老王悠悠飘过一句:"用SAS的字符串函数啊,5分钟搞定..."
SUBSTR
函数截取身份证生日,比手动复制粘贴快100倍 💡 根据2025年数据工程师调研,SAS仍是医疗金融领域文本处理的Top1工具
SUBSTR()
data patient; name = "王小明_住院部"; clean_name = substr(name, 1, 3); /* 截取前3个字 → 王小明 */ run;
CATX()
full_addr = catx("-", "上海市","浦东新区","张江路1200号"); /* 输出:上海市-浦东新区-张江路1200号 */
FIND()
pos = find("糖尿病II型", "II"); /* 返回4,即从第4个字符开始 */
TRANWRD()
new_text = tranwrd("患者拒绝服药", "拒绝", "同意"); /* 输出:患者同意服药 */
STRIP() /* 去掉首尾空格 */ COMPBL() /* 合并多个空格为1个 */ COMPRESS() /* 删除所有空格 */
需求:清理包含"【异常】"标记的检验值
data lab_clean; set lab_raw; if find(blood_test, "【异常】") > 0 then do; /* 先删除标记 */ clean_value = tranwrd(blood_test, "【异常】", ""); /* 再提取数字部分 */ final_value = input(compress(clean_value, , 'kd'), best12.); end; run;
🚨 重点技巧:
compress(..., 'kd')
中的kd
参数表示只保留数字
正则表达式暴击:
prxchange('s/[^\u4e00-\u9fa5]//', -1, text) /* 删除所有非中文字符 */
超长文本拆分:
/* 每50字符拆分成新行 */ do i=1 by 50 while(i<=length(long_text)); segment = substr(long_text, i, 50); output; end;
隐藏彩蛋:
PROC FCMP
自定义函数可以封装常用字符串操作,
proc fcmp outlib=work.funcs.mylib; function chn_num2arabic(text $) $; /* 把"一百二十"转成"120" */ ...自定义代码... endsub; run;
TRANWRD
失效 LENGTH
限定变量长度 SCAN
函数 最后的小测验:
如果遇到"2025-08-15_病历【未归档】.pdf"这样的文件名,如何用SAS提取出"20250815"?
(答案提示:compress(substr(filename,1,10),'-')
)
掌握这些技巧后,你也能像老王一样淡定地说:"这种问题,用SAS不就一行代码的事?" 😎
本文由 机代芹 于2025-08-04发表在【云服务器提供商】,文中图片由(机代芹)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/533029.html
发表评论