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

在SAS的INCLUDE命令中使用LET变量?,sas,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\

我试图通过定义一个名为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
语句末尾=/

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

%LET root = C:\Documents and Settings\me\Desktop\mine\SAS;
%include "&root.\lib\work.sas"
实际上,只有当变量名“触及”某些内容时才需要这样做,但我建议始终使用它——这是一个很好的实践。此外,当变量名后面有一个点时,您应该将“that”放在点上,这样会有两个点,如:

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


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

我怀疑在代码中此语句之前的某个地方还有另一个bug。尝试重新启动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";

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

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之后)。

太棒了,谢谢!如果运气好的话,我会掌握SAS的诀窍。祝你好运,不要犹豫,在Stack上分享你的问题。我会看着你的抱歉,这是不正确的,不需要添加句点,也无法解决此问题。请看我的回答。另外,依我看,添加句点是唯一的好做法,因为它会降低可读性。@Rob Penridge,你可能没有注意到OP认为这个答案是正确的,所以我的解决方案很有帮助。另外,我从来没有说过加一个句号是必要的,所以看起来你对我的答案关注不够。至于练习,当您始终添加句点时,您不需要记住何时需要句点,并且您可以确定,其他使用您的代码的人也不需要句点。奇怪的是,你在“多年”的练习中没有抓住它。更重要的是,否决正确答案仅仅是因为它与你的答案不同,只是表明你不理解SO规则。@WojtusJ我将你的解决方案标记下来,因为它不能解决OP所述的问题,并且对未来遇到相同问题的人没有用。如果你不这么认为,请随意调整你的答案,以证明这一点,我将很乐意投票表决。是的,OP确实将您的答案标记为正确,但我相信这不是第一次(也不会是最后一次)将错误答案标记为正确。您确实说过添加分隔符是必要的,并引用了您的回答:“您必须使用分隔符”。尊敬的先生,您是否100%确定“SAS足够聪明,知道\字符不能是宏名称的一部分”这句话适用于所有编码配置?SAS有那么聪明吗?当宏不在A-Za-z0-9_389;中时,SAS会识别宏的结尾-这是默认设置。我不同意不使用终止符。(我认为这有助于可读性)但我同意这并不是上面发布的错误的具体原因,除非OP没有说什么。是的,乔,看来你是对的。要重新创建该错误,您需要提交缺少分号的代码,再次提交,然后提交任何有效的SAS代码。这将重现OP所说的错误。同意,你是对的-我遗漏了分号,这可能是这种情况下的问题。如果你不