You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效提取含特定数字后缀的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;

现有数据

IDProductAmount_soldPrice_per_unit
123456789Pen302
63495837229-01Book205
ABC134475472 02Folder297
AB-1235674467-00Pencil261
69598346-02Correction pen151.50
6970457688Highlighter152
584028467Color pencil1510

期望结果

IDProductAmount_soldPrice_per_unit
123456789Pen302
63495837229Book205
ABC134475472Folder297
AB-1235674467Pencil261
69598346Correction pen151.50
6970457688Highlighter152
584028467Color pencil1510

解决方案

方法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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 19:15:51