在SAS中搜索包含字符和数字的模式

时间:2018-12-14 15:47:54

标签: sql sas

我正在检查数据质量,并试图查看正确填充了多少行。该字段应包含一个字符串,该字符串包含一个字符,后跟九个数字,并且类型为“字符”,长度为10。

例如。

  • A123456789
  • B123531490
  • C319861045

我尝试使用PRXMATCH函数,但是不确定我是否使用正确的语法。我还尝试过将PROC SQL与“不像[[AZ] [0-9] [0-9]”的地方”等等一起使用。我的感觉是这应该不难执行,有人可以解决吗? / p>

最诚挚的问候

4 个答案:

答案 0 :(得分:1)

您可以构造一个REGEX进行测试。或者只是使用常规SAS功能构建测试。

data want ;
  set have ;
  flag1 = prxmatch('/^[A-Z][0-9]{9}$/',trim(name));
  test1 = 'A' <= name <= 'Z' ;
  test2 = not notdigit(trim(substr(name,2))) ;
  test3 = length(name)=10;
  flag2 = test1 and test2 and test3 ;
run;

结果:

Obs    name             flag1    test1    test2    test3    flag2

 1     A123456789590      0        1        1        0        0
 2     B123531490ABC      0        1        0        0        0
 3     C3198610           0        1        1        0        0
 4     A123456789         1        1        1        1        1
 5     B123531490         1        1        1        1        1
 6     C319861045         1        1        1        1        1

答案 1 :(得分:0)

您可以使用:

^[a-zA-z][0-9]{9}$

答案 2 :(得分:0)

内置SAS功能NOTALPHANOTDIGIT可以执行验证测试。

invalid_flag = notalpha(substr(s,1,1)) || notdigit(s,2) ;

您可以直接使用where语句或选项选择无效记录

data invalid;
  set raw;
  where notalpha(substr(s,1,1)) || notdigit(s,2) ;  * statement;
run;

data invalid;
  set raw (where=(notalpha(substr(s,1,1)) || notdigit(s,2)));  * data set option;
run;

NOT*ANY*系列中有多个函数,它们可以提供比PRX*系列中的通用正则表达式函数更快的性能。

答案 3 :(得分:0)

您可以如下所示使用prxparse和prxmatch。

 data have;
 input name $20.;
 datalines;
 A123456789590
 B123531490ABC
 C3198610
 A123456789
B123531490
 C319861045
 ;


data want;
set have;
if _n_=1 then do; 
retain re; 
re = prxparse('/^[a-zA-z][0-9]{9}$/'); 
end;
if prxmatch(re,trim(name))  gt 0 then Flag ='Y';
else Flag ='N';
drop re;
run;

如果只想记录符合条件的记录,则使用

 data want;
set have;
if _n_=1 then do; 
retain re; 
re = prxparse('/^[a-zA-z][0-9]{9}$/'); 
end;
if prxmatch(re,trim(name));
drop re;
run;