如何高效提取含特定数字后缀的ID并移除该后缀?
问题:批量处理带指定后缀的ID数据,提取目标ID并移除后缀
现有不同长度的ID数据,需提取末尾包含-00、02或-01的ID以统计命中率,随后移除这些后缀。尝试使用SUBSTR函数切片处理,但因ID格式多样效果不佳,现寻求更高效的SAS代码实现方案。
尝试过的代码
Proc sql; Create table work.data1 AS SELECT Product, Amount_sold, Price_per_unit, CASE WHEN Product Contains "Pen" and Lenghth(ID) >= 9 Then ID = SUBSTR(ID,1,9) WHEN Product Contains "Book" and Lenghth(ID) >= 11 Then ID = SUBSTR(ID,1,11) WHEN Product Contains "Folder" and Lenghth(ID) >= 12 Then ID = SUBSTR(ID,1,12) ... END AS ID FROM A Quit;
现有数据
| ID | Product | Amount_sold | Price_per_unit |
|---|---|---|---|
| 123456789 | Pen | 30 | 2 |
| 63495837229-01 | Book | 20 | 5 |
| ABC134475472 02 | Folder | 29 | 7 |
| AB-1235674467-00 | Pencil | 26 | 1 |
| 69598346-02 | Correction pen | 15 | 1.50 |
| 6970457688 | Highlighter | 15 | 2 |
| 584028467 | Color pencil | 15 | 10 |
期望结果
| ID | Product | Amount_sold | Price_per_unit |
|---|---|---|---|
| 123456789 | Pen | 30 | 2 |
| 63495837229 | Book | 20 | 5 |
| ABC134475472 | Folder | 29 | 7 |
| AB-1235674467 | Pencil | 26 | 1 |
| 69598346 | Correction pen | 15 | 1.50 |
| 6970457688 | Highlighter | 15 | 2 |
| 584028467 | Color pencil | 15 | 10 |
解决方案
方法1:正则表达式(高效通用)
利用SAS的正则函数PRXCHANGE直接匹配并替换目标后缀,同时用PRXMATCH标记命中状态用于统计命中率:
Proc sql; Create table work.data1 AS SELECT Product, Amount_sold, Price_per_unit, /* 替换末尾的-00、-01或空格+02为空 */ PRXCHANGE('/(-00|-01| 02)$/', 1, ID) AS ID, /* 标记是否命中目标后缀(1=命中,0=未命中) */ CASE WHEN PRXMATCH('/(-00|-01| 02)$/', ID) THEN 1 ELSE 0 END AS hit_flag FROM A; Quit;
- 优势:无需按产品类型区分ID长度,自动适配所有格式的ID,代码简洁高效。
- 正则说明:
$表示匹配字符串末尾,确保只处理末尾的后缀;|表示或逻辑,覆盖三种后缀情况。
方法2:字符串函数组合(无需正则)
通过LIKE判断后缀类型,再用SUBSTR截取有效ID部分:
Data work.data1; Set A; /* 判断是否包含目标后缀 */ if ID like '%-00' or ID like '%-01' or ID like '% 02' then do; hit_flag = 1; /* 根据后缀分隔符截取前半部分 */ if substr(ID, length(ID)-2, 1) in ('-', ' ') then do; ID = substr(ID, 1, length(ID)-3); end; end; else do; hit_flag = 0; end; Run;
- 优势:无需了解正则语法,逻辑直观,适合对正则不熟悉的场景。
内容的提问来源于stack exchange,提问作者Jing Jing
相关产品推荐
相关产品推荐

