我正在检查数据质量,并试图查看正确填充了多少行。该字段应包含一个字符串,该字符串包含一个字符,后跟九个数字,并且类型为“字符”,长度为10。
例如。
我尝试使用PRXMATCH函数,但是不确定我是否使用正确的语法。我还尝试过将PROC SQL与“不像[[AZ] [0-9] [0-9]”的地方”等等一起使用。我的感觉是这应该不难执行,有人可以解决吗? / p>
最诚挚的问候
答案 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功能NOTALPHA
和NOTDIGIT
可以执行验证测试。
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;