SAS技术问询:如何从字符串变量提取指定数字生成新变量
解决SAS中提取位置不固定的目标数字问题
我来帮你搞定这个需求!你之前用scan函数遇到问题很正常——因为目标数字的位置不固定,按固定位置取词的方法肯定会失效。结合你已经创建的宏变量%let num=1013456,2017685,1897654,这里给你两个靠谱的实现方案:
方案一:正则表达式匹配(灵活适配位置变化)
正则表达式可以根据数字的模式(比如3位的ser编号、7位的目标ID)来精准提取,完全不受位置影响。步骤如下:
- 先把宏变量里的7位数字列表转成临时数据集(方便后续校验)
%let num=1013456,2017685,1897654; /* 拆分宏变量中的逗号分隔数字,生成临时数据集 */ data num_list; length target_num $7; do i = 1 to countw("&num.", ","); target_num = scan("&num.", i, ","); output; end; run;
- 处理原始数据集,提取ser编号和对应7位数字,生成目标格式的新变量
假设你的原始数据集叫raw_data,存储文本的变量叫text:
data final_output; set raw_data; length ser_num $3 target_num $7 new_var $50; /* 匹配并提取ser后面的3位编号 */ rx_ser = prxparse('/ser\s+\w+\s+(\d{3})/'); if prxmatch(rx_ser, text) then do; ser_num = prxposn(rx_ser, 1, text); end; /* 在文本中查找属于目标列表的7位数字 */ rx_target = prxparse('/(\d{7})/'); start_pos = 1; do while(prxmatch(rx_target, text, start_pos)); current_num = prxposn(rx_target, 1, text); /* 检查当前数字是否在宏变量的目标列表里 */ if current_num in ("&num.") then do; target_num = current_num; leave; /* 找到匹配项就退出循环,避免重复匹配 */ end; /* 更新起始位置,继续查找下一个7位数字 */ start_pos = prxposn(rx_target, 0, text) + length(prxposn(rx_target, 0, text)); end; /* 生成你需要的格式字符串 */ new_var = catx(' ', 'ser', 'number', ser_num, target_num); /* 保留需要的变量 */ keep ser_num target_num new_var; run;
方案二:Proc SQL关联匹配(简洁高效)
如果你的每条原始文本里只会出现一个目标7位数字,可以用Proc SQL直接关联原始数据集和目标数字列表,代码更简洁:
%let num=1013456,2017685,1897654; /* 先拆分宏变量到临时数据集 */ data num_list; length target_num $7; do i = 1 to countw("&num.", ","); target_num = scan("&num.", i, ","); output; end; run; /* 关联提取并生成目标变量 */ proc sql; create table final_output as select /* 提取ser后面的3位编号 */ prxposn(prxparse('/ser\s+\w+\s+(\d{3})/'), 1, text) as ser_num $3, target_num, /* 拼接成你需要的格式 */ catx(' ', 'ser', 'number', calculated ser_num, target_num) as new_var from raw_data, num_list /* 筛选出文本包含当前目标数字的记录 */ where index(text, target_num) > 0; quit;
为什么scan函数不好用?
scan是按分隔符和位置取词的,比如scan(text, 3)取第3个词,但你的数字位置不固定(有时是第5个,有时是第4个),一旦文本结构变化就会提取错误。而正则表达式是按内容模式匹配,不管位置在哪,只要符合“ser后面跟3位数字”“7位数字”的模式就能精准提取。
内容的提问来源于stack exchange,提问作者ckp
相关产品推荐
相关产品推荐

