从文本字段提取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
相关产品推荐
相关产品推荐

