我对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 中,因此原则上它可以工作-只是打印步骤不起作用。有什么想法吗?
答案 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开始运行时设置了自动宏变量SYSDAY
和SYSDATE
,并且我在昨天开始的SAS会话中运行了此代码。