SAS中带有宏的“ Hello World”给出语法错误

时间:2019-01-11 16:27:41

标签: sas sas-macro

我对SAS世界非常陌生,所以很自然地我试图写我的“ Hello World”。这是我的MWE,它给了我语法错误:

/* SAS Hello World Program */

    /*Macro with date*/
    %Macro datum;
    Title "Hello World, today is &Sysday, &Sysdate";
    %Mend datum;

    /*Create Hello World Data Set */     
    data HelloWorld;
    msg = %datum ;
    run;

    /*Print Hello World*/
    proc print data = HelloWorld;
    run;

它不打印“ Hello Wolrd”消息,而是给出了我不理解的语法错误。该消息会出现在 Log 中,因此原则上它可以工作-只是打印步骤不起作用。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您将其用作标题,因此如果您是初学者,则不能将其用作赋值变量,请使用

/* this will print in log*/
data _null_;
put "hello world";
run;

/* or use in datastep by making variable or by using macrovariable*/
%let a= Hello World, today is &Sysday, &Sysdate;
data have;
var= "Hello world";
var2= "&a";
run;


proc print data = have;
run;

答案 1 :(得分:1)

您创建的宏会生成TITLE语句。因此应该可以正常工作。

但是您的程序在错误的位置使用了它。一旦您的宏运行并完成生成TITLE语句的文本,您的数据步骤将如下所示:

data HelloWorld;
  msg = Title "Hello World, today is Thursday, 10JAN19"; ;
run;

这显然会给出错误,因为赋值语句的右侧现在有两个标记,一个名为TITLE的变量和一个字符串常量,它们之间没有任何运算符。多余的分号只会生成一个额外的null语句,不会引起任何问题。

也许您想创建一个VARIABLE宏而不是一个实际的宏?

要做到这一点,您的程序将更像这样。

%let msg=Hello World, today is &Sysday, &Sysdate ;

data HelloWorld;
  msg = "&msg." ;
run;

因此,当替换宏变量引用时,它将评估要运行的SAS代码。

data HelloWorld;
  msg = "Hello World, today is Thursday, 10JAN19" ;
run;

请注意如何使用&来触发对宏变量的求值。还请注意,我没有将引号添加到宏变量的值中,而是将它们包括在使用宏变量的值生成的SAS代码中。

请注意,它具有昨天的星期几和日期。这是因为在SAS开始运行时设置了自动宏变量SYSDAYSYSDATE,并且我在昨天开始的SAS会话中运行了此代码。