[英]SAS equivalent for SQL validation of string data
我正在尝试验证一些长度为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作为我的工具。
谢谢!
假设您正在询问将其编写为SAS代码,则可以采用多种方法来完成此操作。 您可以做的最相似的事情是使用Perl正则表达式。 我不认为SAS中的LIKE不支持正则表达式语法(尽管[
是特殊字符),或者至少文档没有提及它,而且我无法使其正常工作。
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数据步骤中执行相同的操作,或者执行其他同样有效的操作。
您也可以考虑使用FIND( 要搜索的 字符串,您要查找的字符串 )。
http://support.sas.com/documentation/cdl/zh-CN/lrdict/64316/HTML/default/viewer.htm#a002267763.htm
FIND函数在字符串中搜索指定子字符串的首次出现,然后返回该子字符串的位置。 如果在字符串中找不到子字符串,则FIND返回值0。
只要您的FIND()返回的数字大于0,您就会知道那里有一个匹配项。
我认为Joe的使用带有prxmatch()的Perl正则表达式的答案是解决此问题的最佳方法。 但是,为了演示SAS宏和字符串函数,这里是一种替代方法。
用这种方法,依次检查每个字符。 substr(,&pos,1)隔离字符,如果字符类型不正确(由'x'是'a'或'd'指定),则compress(,,'xk')删除该字符。 如果字符的类型正确,则应用lengthn()函数将返回1,否则返回0。 请注意,length()将不起作用,因为它将为空字符串返回1。 然后,如果所有字符均为正确类型,则分配“有效”。
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';
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.