在SAS中的INCLUDE命令中使用LET变量?

时间:2012-09-18 16:53:11

标签: sas

我正在尝试通过定义一个名为root的宏变量来组织我的SAS代码。然后,我希望能够让所有%INCLUDE语句都使用&root值,以便根据根目录定义%INCLUDE

%LET root = C:\Documents and Settings\me\Desktop\mine\SAS;
%include "&root\lib\work.sas"

但是,尝试在SAS 9.2下运行时,我从日志中收到以下错误:

1    %LET root = C:\Documents and Settings\me\Desktop\mine\SAS;
ERROR: Incorrect %INCLUDE statement will not be executed. There is a syntax error.
2    %include "&root\lib\work.sas"

因此看起来好像&root变量未在%INCLUDE语句中扩展为其值。我做错了什么?

谢谢!

[编辑]回答

我错过了';'声明末尾的%INCLUDE。 = /

3 个答案:

答案 0 :(得分:4)

在这种情况下,您可能需要使用分隔符,它标记宏变量名称的结尾,即“。”,因此您的代码将如下所示:

%LET root = C:\Documents and Settings\me\Desktop\mine\SAS;
%include "&root.\lib\work.sas"

这实际上只有在变量名称“触及”某些东西时才需要,但我建议总是使用它 - 这是一个很好的做法。此外,当变量名称后面有一个点时,你应该加上“那个”点,所以会有两个点,如:

%LET root = C:\Documents and Settings\me\Desktop\mine\SAS;
%LET fname = work;
%include "&root.\lib\&fname..sas"

修改

正如@Joe在其他答案中正确指出的那样,在这种情况下的真正问题是在%INCLUDE 语句之后缺少分号。将它放在路径之后应解决问题。

答案 1 :(得分:3)

我不得不说你对错误的介绍以及你接受的答案感到有点困惑。根据我的经验,ERROR: Incorrect %INCLUDE statement会出现在第二行之后,而不是之前。另外,如果宏变量分辨率是问题,那么您将看到以下内容:

903  %LET root = C:\temp;
904
905  %include "&roots\test.sas";
WARNING: Apparent symbolic reference ROOTS not resolved.
WARNING: Physical file does not exist, C:\Users\xxxx\&roots\test.sas.
ERROR: Cannot open %INCLUDE file &roots\test.sas.

在包含的代码中,%include后没有分号。这可能与问题有关吗?当我运行%include然后另一行是非法的,例如以相反的顺序运行它们时,我确实得到了这个错误(但仍然在%include之后)。

答案 2 :(得分:2)

我怀疑您在代码中的此语句之前的某个地方有另一个错误。尝试重新启动SAS并执行这两行代码,它应该可以正常工作,它对我来说很好用

%let root = c:\documents and settings\robert.penridge\desktop\mine\sas;
%include "&root\lib\work.sas";

编辑:这对我有用,因为我实际上添加了一个分号。在@ Joe正确诊断问题之后意识到这一点。

我在桌面上创建了以下文件夹结构:

\mine\sas\lib

然后将work.sas放在那里,内容如下:

%put blah;

当我运行代码时,结果打印blah就好了没有错误消息。事实上,我已经在许多版本的SAS和许多操作系统中使用了这样的代码多年。您的代码没有问题。

与其他一些答案在这里提出的建议相反,SAS足够聪明,知道\字符不能成为宏名称的一部分,因此不需要明确说明宏的结尾。 .字符。

最后,如果您尝试调试宏代码,还可以打开以下选项:

option mprint mlogic macrogen symbolgen source source2;

您可以将其关闭:

option nomprint nomlogic nomacrogen nosymbolgen nosource nosource2;

请注意,在SAS环境中,其中一些可能已默认启用。

在极少数情况下,您可能还会遇到宏报价问题。如果您一直在使用%str() %bquote()之类的宏函数,则会发生这种情况......如果是这种情况,那么通常可以通过使用围绕宏变量的%unquote()函数来解决它造成问题。从您的代码示例看,这似乎不是问题,但您可能已经简化了帖子的代码。如果是这种情况,那么在您的情况下,代码将更改为如下所示:

%let root = c:\documents and settings\robert.penridge\desktop\mine\sas;
%include "%unquote(&root)\lib\work.sas";