如何在SAS Enterprise Guide的PROC SQL中删除_M2及之后的字符?
修改PROC SQL语句实现字段内容截取
根据你给出的示例数据和期望结果,核心需求是去掉COL1字段中最后一个下划线及之后的所有字符,以下是几种可行的修改方案:
方案一:使用正则表达式(最灵活)
利用SAS的PRXCHANGE函数匹配并替换最后一个下划线及后续内容:
proc sql; create table work.table1 as select prxchange('s/_[^_]*$//', 1, COL1) as COL1, COL2 from my_table ;quit;
说明:
- 正则表达式
s/_[^_]*$//的含义:_匹配目标下划线[^_]*匹配下划线之后所有非下划线的字符$表示匹配字符串末尾- 整体作用是把最后一个下划线及后面的内容替换为空
方案二:通过反转字符串定位最后一个下划线
先反转字符串找到第一个下划线的位置(对应原字符串的最后一个下划线),再截取前面的内容:
proc sql; create table work.table1 as select substr(COL1, 1, length(COL1) - index(reverse(COL1), '_')) as COL1, COL2 from my_table ;quit;
说明:
reverse(COL1):将COL1内容反转,比如A_MON_P2022变成2202P_NOM_Aindex(...):找到反转后字符串中第一个下划线的位置(对应原字符串最后一个下划线的位置)length(COL1) - 该位置:计算需要保留的原字符串长度,再用substr截取
特殊情况处理:若需仅删除从"_M2"开头的后缀
如果确实是只删除从_M2开始到末尾的内容(而非所有最后下划线后缀),可以用条件判断结合字符串截取:
proc sql; create table work.table1 as select case when index(COL1, '_M2') > 0 then substr(COL1, 1, index(COL1, '_M2') - 1) else COL1 end as COL1, COL2 from my_table ;quit;
说明:
index(COL1, '_M2'):查找_M2在COL1中的起始位置- 若找到则截取该位置之前的内容,否则保留原字段内容
内容的提问来源于stack exchange,提问作者dingaro
相关产品推荐
相关产品推荐

