String 字符串变量中不同位置的多个数字

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

我在一个字符串变量中有7位数字,但每个记录的列不同。下面是我的数据示例

ser       string
101      purchase items id: 1013456
102      entry no: 2017685
103      id: 1897654 item
.....
.....
我的要求是创建一个新变量,只使用数值from
string
变量。输出应该如下所示

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始终忘记该开关。谢谢