String 字符串变量中不同位置的多个数字
我在一个字符串变量中有7位数字,但每个记录的列不同。下面是我的数据示例String 字符串变量中不同位置的多个数字,string,sas,substr,String,Sas,Substr,我在一个字符串变量中有7位数字,但每个记录的列不同。下面是我的数据示例 ser string 101 purchase items id: 1013456 102 entry no: 2017685 103 id: 1897654 item ..... ..... 我的要求是创建一个新变量,只使用数值fromstring变量。输出应该如下所示 ser number 101 1013456 102 2017685 10
ser string
101 purchase items id: 1013456
102 entry no: 2017685
103 id: 1897654 item
.....
.....
我的要求是创建一个新变量,只使用数值fromstring
变量。输出应该如下所示
ser number
101 1013456
102 2017685
103 1897654
我有一个可以创建为宏变量的数字列表
%let num=1013456,2017685,1897654
我使用了scan
和substr
函数,但没有得到期望的结果
如果能找到解决办法,我将不胜感激。谢谢尝试使用
compress()
函数删除不需要的字符,并使用input()
函数转换为数字
data want;
set have;
number = input(compress(string,':','as'),7.);
drop string;
run;
要压缩的第二个参数显式删除
:
字符。as
修饰符删除字母字符(a
)和空格字符(s
)。尝试使用compress()
函数删除不需要的字符,使用input()
函数转换为数字
data want;
set have;
number = input(compress(string,':','as'),7.);
drop string;
run;
要压缩的第二个参数显式删除
:
字符。as
修饰符删除字母字符(a
)和空格字符(s
)。您可以使用正则表达式提取数字。查看SAS中的PRX功能
下面是一个如何使用正则表达式实现目标的示例:
data inData;
length ser 8 string $100;
ser = 101;
string = 'purchase items id: 1013456';
output;
ser = 102;
string = 'entry no: 2017685';
output;
ser = 103;
string = 'id: 1897654 item';
output;
run;
data outData;
length ser 8 number $7;
retain re;
set inData;
if _n_ = 1 then do;
re = prxparse("/.*(\d{7}).*/");
end;
if prxmatch(re, string) then do;
number = prxposn(re, 1, string);
end;
keep ser number;
run;
您可以使用正则表达式来提取数字。查看SAS中的PRX功能 下面是一个如何使用正则表达式实现目标的示例:
data inData;
length ser 8 string $100;
ser = 101;
string = 'purchase items id: 1013456';
output;
ser = 102;
string = 'entry no: 2017685';
output;
ser = 103;
string = 'id: 1897654 item';
output;
run;
data outData;
length ser 8 number $7;
retain re;
set inData;
if _n_ = 1 then do;
re = prxparse("/.*(\d{7}).*/");
end;
if prxmatch(re, string) then do;
number = prxposn(re, 1, string);
end;
keep ser number;
run;
仅使用
prxmatch
的稍微简单的正则表达式方法:
data have;
input ser string $50.;
cards;
101 purchase items id: 1013456
102 entry no: 2017685
103 id: 1897654 item
;
run;
data want;
set have;
num = input(substr(string,prxmatch('/\d{7}/',string),7),8.);
run;
这将仅与
字符串中的前7位数字匹配。相反,如果它包含任何其他数字,则压缩方法将连接所有数字。一种仅使用prxmatch的稍微简单的正则表达式方法:
data have;
input ser string $50.;
cards;
101 purchase items id: 1013456
102 entry no: 2017685
103 id: 1897654 item
;
run;
data want;
set have;
num = input(substr(string,prxmatch('/\d{7}/',string),7),8.);
run;
这将仅与字符串中的前7位数字匹配。相反,如果它包含任何其他数字,则压缩方法将连接所有数字。在字符串中是否有任何其他数字?您是否一直在寻找一个7位数的数字?如果嵌入的数字可以有8位数或更多位数,那么您需要的不仅仅是一个简单的正则表达式模式,以确保您只获取7位数的值您的字符串中是否有任何其他数字
变量?你一直在寻找一个7位数的数字吗?如果嵌入的数字可以有8位数或更多位数,那么你需要的不仅仅是一个简单的正则表达式模式,以确保你只获取7位数的值,或者你只需要添加'kd'
作为修饰符,这将只保留数字,我总是忘记这个开关。谢谢或者,您可以添加'kd'
作为修饰符,这将只保留digitsI始终忘记该开关。谢谢