';世界你好';在带有宏的SAS中,出现语法错误

';世界你好';在带有宏的SAS中,出现语法错误,sas,sas-macro,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 */

我对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;

它没有打印“hellowold”消息,而是给出了一个语法错误,我不理解。在日志中出现消息,因此原则上它是有效的-只是打印步骤不起作用。有什么想法吗?

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

/* 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;

你有它作为标题,所以你不能使用它作为赋值变量,如果你是初学者,那么就使用它

/* 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;

创建的宏将生成标题语句。所以它应该可以正常工作

但是你的程序在错误的地方使用它。宏运行并完成标题语句文本的生成后,数据步骤将如下所示:

data HelloWorld;
  msg = Title "Hello World, today is Thursday, 10JAN19"; ;
run;
这显然会给出一个错误,因为赋值语句的右侧现在有两个标记,一个名为TITLE的变量和一个字符串常量,它们之间没有任何运算符。额外的分号只会生成一个额外的null语句,不会引起任何问题

也许您想创建一个宏变量而不是实际的宏

为此,您的程序看起来更像这样

%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代码中


请注意,它有一周中的昨天和日期。这是因为自动宏变量
SYSDAY
SYSDATE
是在SAS开始运行时设置的,我在昨天启动的SAS会话中运行了此代码。

您创建的宏生成一条TITLE语句。所以它应该可以正常工作

但是你的程序在错误的地方使用它。宏运行并完成标题语句文本的生成后,数据步骤将如下所示:

data HelloWorld;
  msg = Title "Hello World, today is Thursday, 10JAN19"; ;
run;
这显然会给出一个错误,因为赋值语句的右侧现在有两个标记,一个名为TITLE的变量和一个字符串常量,它们之间没有任何运算符。额外的分号只会生成一个额外的null语句,不会引起任何问题

也许您想创建一个宏变量而不是实际的宏

为此,您的程序看起来更像这样

%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代码中


请注意,它有一周中的昨天和日期。这是因为自动宏变量
SYSDAY
SYSDATE
是在SAS开始运行时设置的,我在昨天启动的SAS会话中运行了此代码。

您不需要宏或title语句。在本例中,您将使用
%let msg=“你好,今天是&Sysday,&Sysdate”并在数据步骤中使用
msg=&msg“对SAS世界来说非常新”--暂时避免使用宏。通过分组处理学习数据步骤的基本过程。然后强烈建议阅读有关宏的介绍性材料,而不要只是随机应变。大量优秀的会议论文,请尝试搜索coursera上也有SAS课程@里扎听起来很有趣!你完成课程了吗?@user190080这是一门入门级课程,今年开始。我已经使用SAS很长时间了。您不需要宏或标题语句。在本例中,您将使用
%let msg=“你好,今天是&Sysday,&Sysdate”并在数据步骤中使用
msg=&msg“对SAS世界来说非常新”--暂时避免使用宏。通过分组处理学习数据步骤的基本过程。然后强烈建议阅读有关宏的介绍性材料,而不要只是随机应变。大量优秀的会议论文,请尝试搜索coursera上也有SAS课程@里扎听起来很有趣!你完成课程了吗?@user190080这是一门入门级课程,今年开始。我已经使用SAS很长时间了。Thx,非常有用!我没有意识到SAS中宏和宏变量之间的区别,只是尝试了一下。当时的问题是,我真的无法理解SAS日志文件。是否可以将变量赋值中的引号交换给调用(现在无法测试),或者这在语法上是不可能的?对于宏处理器来说,引号是值的一部分。要编写SAS代码,解析器需要引号来区分字符串值、变量名或数字。宏处理器不需要它,因为它只是寻找
&
%
触发器。只要生成有效的SAS代码,就可以将引号放在任何地方。只是不要感到困惑,以为宏处理器会像SAS代码那样为您删除引号。您可以使用
MPRINT
选项让SAS显示宏生成的代码。和
SYMBOLGEN
选项,以显示宏变量生成的值。这可以使日志更容易解释。但是如果您的宏很复杂,那么使用
SYMBOLGEN
会生成太多的消息,以至于日志无法读取。Thx,非常有用!我没有意识到SAS中宏和宏变量之间的区别,只是尝试了一下。当时的问题是,我真的无法理解SAS日志文件。能不能换一个