SQL 字符串数据验证的 SAS 等价物

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 不支持正则表达式语法(尽管 [ 是一个特殊字符),或者至少 documentation 没有尽可能提到它,我无法让它工作。

data have;
length charvar ;
  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 中做同样的事情,或者其他一些同样有效的事情。

你也可以考虑使用FIND(要搜索的字符串,你要查找的字符串).

http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a002267763.htm

The FIND function searches string for the first occurrence of the specified substring, and returns the position of that substring. If the substring is not found in string, FIND returns a value of 0.

只要您的 FIND() returns 是一个大于 0 的数字,您就会知道其中有一个匹配项。

我认为 Joe 使用 Perl 正则表达式和 prxmatch() 的答案是解决这个问题的最佳方法。但是,为了演示 SAS 宏和字符串函数,这里有一个替代方法。

在这种方法中,依次检查每个字符。 substr(,&pos,1) 隔离字符,并且 compress(,'xk') 删除不正确类型的字符(由 'x' 是 'a' 还是 'd').应用 lengthn() 函数 returns 如果字符类型正确则为 1,否则为 0。请注意,length() 将不起作用,因为它会 return 1 用于空字符串。然后,如果所有字符的类型都正确,则分配 'Valid'。

data have;
    length charvar ;
    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  ;
    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';