我试图验证一些长度为6的字母数字数据,并且我在SQL中有一段代码可以执行此操作,但我在如何使用SAS作为计算列进行编码时遇到了困难。我的询问。
在SQL中,我的数据中的有效字符串符合以下条件:
CASE
WHEN <String> LIKE '[a-z][0-9][a-z][0-9][a-z][0-9]'
THEN 'Valid'
ELSE 'Invalid'
END
我可以在SAS中使用哪些功能来实现这一目标?我使用SAS EG作为我的工具。
谢谢!
答案 0 :(得分:2)
假设您要求将其写为SAS代码,可以通过多种方式完成此操作。你可以做的最相似的是使用Perl正则表达式;我不认为SAS中的LIKE支持正则表达式语法(尽管[
是一个特殊字符),或者至少documentation没有提到它,我无法让它工作。
data have;
length charvar $6;
input charvar $;
datalines;
a1b2c3
1A2B3C
AAAAAA
111111
C3B2A1
;;;;
run;
proc sql;
select charvar,
CASE
WHEN prxmatch('/[a-z][0-9][a-z][0-9][a-z][0-9]/i',charvar)
THEN 'Valid'
ELSE 'Invalid'
END
from have;
quit;
您可以在SAS datastep中执行相同的操作,或者其他一些可以正常工作的事情。
答案 1 :(得分:0)
您还可以考虑使用FIND(要搜索的字符串, 您要查找的字符串 )。
http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a002267763.htm
FIND函数在字符串中搜索指定子字符串的第一个匹配项,并返回该子字符串的位置。如果在字符串中找不到子字符串,则FIND返回值0。
只要你的FIND()返回一个大于0的数字,你就会知道你在那里有一个匹配。
答案 2 :(得分:0)
我认为Joe使用Perx正则表达式和prxmatch()的答案是解决这个问题的最佳方法。但是,为了演示SAS宏和字符串函数,这里有一个替代方案。
在这种方法中,依次检查每个角色。 substr(,&amp; pos,1)隔离字符,如果字符的类型不正确,则压缩(,&#39; xk&#39;)删除字符(由&#39; x&#39;是&#39; a&#39;或者&#39;)。如果字符的类型正确,则应用lengthn()函数返回1,否则返回0。请注意,length()将不起作用,因为它将为空字符串返回1。然后,&#39;有效&#39;如果所有字符的类型都正确,则会被分配。
data have;
length charvar $6;
input charvar $;
datalines;
a1b2c3
1A2B3C
AAAAAA
111111
C3B2A1
;
run;
* invar is the variable, pos is the position of the letter being checked, type is be d for digits or a for letters;
%macro check(invar, pos, type) ;
(1 = lengthn(compress(substr(&invar, &pos, 1), , "&type.k")))
%mend ;
data validation ;
set have ;
length validation $7 ;
if %check(charvar, 1, a) & %check(charvar, 2, d) & %check(charvar, 3, a) &
%check(charvar, 4, d) & %check(charvar, 5, a) & %check(charvar, 6, d)
then validation = 'Valid' ;
else validation = 'Invalid' ;
run ;
dm 'vt validation';