我正在尝试通过定义一个名为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
。 = /
答案 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";