如何解释这个SAS宏?

时间:2019-03-21 15:20:04

标签: sas

我是一名新的SAS学习者。这是SAS语句。

%if %sysfunc(prxmatch(/^(E0349646)$/i, &SYSUSERID.)) ne 0 %then %do;

我只知道“ E0348535”是用户ID,但无法理解整个语句。请解释此SAS宏。非常感谢!

2 个答案:

答案 0 :(得分:0)

prxmatch是SAS中的PERL正则表达式函数。该语句正在检查用户ID名称是否包含E0349646prxmatch返回发生匹配的第一个位置。如果找不到匹配项,则为0。

%sysfunc()是宏函数,可让您在宏内使用SAS函数。由于prxmatch是宏中使用的SAS函数,因此必须用%sysfunc()括起来。

最后,nenot equals的另一种说法。综上所述,这是用简单的英语执行的语句:

If the user ID contains 'E0349646', then do some stuff.

答案 1 :(得分:0)

首先介绍术语。 SAS宏处理器是一种可以操纵文本并将结果传递到实际SAS系统进行解释的工具。那一行代码正在使用宏处理器语句,但是它不是完整的宏定义。实际上,从SAS 9.4(我认为可能是维护版本9.4m4?)开始,您可以在常规SAS程序中使用%if/%then/%do类型的语句,而不必完全定义实际的宏。

因此,您拥有的是一个宏%if语句。通用格式为:

%if condition %then statement ;

由于%then部分后面的语句是%do宏语句,因此您的程序将需要一个%end;语句来标记条件为true时要执行的块的结尾。

让我们看看您的%if语句中要测试的条件。

%sysfunc(prxmatch(/^(E0349646)$/i, &SYSUSERID.)) ne 0 

因此,这是使用宏函数%sysfunc()来让您用宏代码调用SAS函数prxmatch()。这是实现Perl正则表达式的函数组的一部分。您还引用了名为SYSUSERID的宏变量。该特定的宏变量是SAS自动创建的一个宏变量,以包含运行SAS程序的用户的用户ID。 prxmatch()函数调用中使用的正则表达式正在测试值是否等于E0349646,忽略大小写。结果将是要搜索的字符串中第一个找到的位置的位置。如果找不到,它将返回0。(SAS与人类一样,使用从1开始而不是从0开始的索引。)。

请注意,在正则表达式中包含^$意味着它需要匹配完整的字符串。因此,您正在测试E0349646是否正在运行该程序。

直接进行测试就更容易了,而无需使用正则表达式或使用非宏函数调用。

%if %upcase(&sysuserid)=E0349646 %then %do;