当前位置:首页 > 问答 > 正文

SAS教程|字符串处理 后浪云SAS教程:掌握SAS字符串操作与应用

🔍 SAS字符串处理全攻略:从菜鸟到高手的进阶之路

场景引入
小张最近接手了一个医疗数据集,患者姓名里混着"张三_N/A"、"李四(已出院)"这样的乱码,领导要求他三天内清洗干净,看着Excel里几百行数据,他差点把键盘摔了——直到同事老王悠悠飘过一句:"用SAS的字符串函数啊,5分钟搞定..."


为什么SAS字符串处理这么香?✨

  1. 数据清洗扛把子:处理病历、地址、问卷文本时,80%的脏数据都能用字符串函数解决
  2. 效率碾压手工SUBSTR函数截取身份证生日,比手动复制粘贴快100倍
  3. 兼容性王者:CSV、TXT、数据库文本字段通吃

💡 根据2025年数据工程师调研,SAS仍是医疗金融领域文本处理的Top1工具


5个必学的核心函数

截取大师 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() /* 删除所有空格 */

实战医疗数据处理案例 🏥

需求:清理包含"【异常】"标记的检验值

SAS教程|字符串处理 后浪云SAS教程:掌握SAS字符串操作与应用

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参数表示只保留数字


高手私藏技巧

  1. 正则表达式暴击

    prxchange('s/[^\u4e00-\u9fa5]//', -1, text) /* 删除所有非中文字符 */
  2. 超长文本拆分

    SAS教程|字符串处理 后浪云SAS教程:掌握SAS字符串操作与应用

    /* 每50字符拆分成新行 */  
    do i=1 by 50 while(i<=length(long_text));  
    segment = substr(long_text, i, 50);  
    output;  
    end;
  3. 隐藏彩蛋
    PROC FCMP自定义函数可以封装常用字符串操作,

    proc fcmp outlib=work.funcs.mylib;  
    function chn_num2arabic(text $) $;  
       /* 把"一百二十"转成"120" */  
       ...自定义代码...  
    endsub;  
    run;

避坑指南 ⚠️

  1. 编码陷阱:处理中文时记得先确认编码,否则可能出现TRANWRD失效
  2. 内存杀手:超长文本建议用LENGTH限定变量长度
  3. 性能黑洞:循环内避免频繁调用SCAN函数

最后的小测验
如果遇到"2025-08-15_病历【未归档】.pdf"这样的文件名,如何用SAS提取出"20250815"?

(答案提示:compress(substr(filename,1,10),'-')

SAS教程|字符串处理 后浪云SAS教程:掌握SAS字符串操作与应用

掌握这些技巧后,你也能像老王一样淡定地说:"这种问题,用SAS不就一行代码的事?" 😎

发表评论