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

从文本字段提取16位账号并生成对应列的SAS技术咨询

在SAS中提取文本字段中的16位账号并生成对应列

解决思路

利用SAS的正则表达式工具prxparse和prxnext,匹配文本中连续16位数字,循环提取所有匹配项并生成对应列。这里的正则表达式可以匹配任意16位数值,而非固定内容,正好满足需求。

完整SAS代码

/* 创建输入数据集 */
data have;
    input acct_num   txt_field $200.; /* 定义足够长度的文本字段,避免截断 */
    DATALINES; 
3435436     Payment issue reported 3456123789065322 to 0909876789432123 dated 9 mar 2024  
7789976     Data declined and assigned to 7890512323454545  
;
run;

/* 提取16位账号并生成对应列 */
data want;
    set have;
    length acct1 acct2 $16; /* 根据实际可能的账号数量,调整变量数和长度 */
    retain re; /* 保留正则表达式编译结果,避免重复编译提升效率 */
    
    /* 首次循环时编译正则表达式 */
    if _n_ = 1 then do;
        /* \b 是单词边界,确保匹配完整的16位账号,不会误抓更长数字中的片段 */
        re = prxparse('/\b\d{16}\b/');
    end;
    
    start = 1;
    /* 提取第一个匹配的16位账号 */
    call prxnext(re, start, length(txt_field), txt_field, pos, len);
    if pos > 0 then acct1 = substr(txt_field, pos, len);
    
    /* 提取第二个匹配的16位账号 */
    call prxnext(re, start, length(txt_field), txt_field, pos, len);
    if pos > 0 then acct2 = substr(txt_field, pos, len);
    
    /* 若有更多账号,可继续添加call prxnext和对应acct变量 */
    /* call prxnext(re, start, length(txt_field), txt_field, pos, len); */
    /* if pos > 0 then acct3 = substr(txt_field, pos, len); */
    
    drop re start pos len; /* 删除临时变量 */
run;

/* 输出结果查看 */
proc print data=want noobs;
run;

代码说明

  • prxparse('/\b\d{16}\b/'):编译正则表达式,\d{16}匹配连续16位数字,\b确保匹配的是独立的16位账号,避免从更长的数字串中截取片段。
  • prxnext:循环查找文本中所有符合规则的匹配项,每次调用返回下一个匹配的起始位置(pos)和长度(len)。
  • substr:根据返回的位置和长度,从文本字段中提取账号并赋值给对应列。

内容的提问来源于stack exchange,提问作者Ezio_Auditore

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 22:25:06