【问题标题】:Using LET variable in INCLUDE command in SAS?在 SAS 的 INCLUDE 命令中使用 LET 变量?
【发布时间】:2012-09-18 16:53:11
【问题描述】:

我正在尝试通过定义一个名为 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 语句末尾缺少';'。 =/

【问题讨论】:

  • 再次感谢大家!我真的很高兴在这里看到如此活跃和乐于助人的 SAS 社区。正如@Joe 指出的那样,问题在于 INCLUDE 末尾缺少的分号(是的,这里是 SAS newb)。
  • 过于本地化:“修正我的错字。” meta.stackexchange.com/a/186376/191410

标签: sas


【解决方案1】:

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

%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 语句后缺少分号。将它放在路径之后应该可以解决问题。

【讨论】:

  • 太棒了,谢谢!运气好的话,我会掌握这些 SAS 东西的窍门。
  • 祝你好运,不要犹豫,在 Stack 上分享你的问题。我会监督你的。 ;-)
  • 抱歉,这是不正确的,添加句点不是必需的,也不会解决问题。请看我的回复。此外,IMO 仅在需要时添加句点是一种好习惯,因为它会降低可读性。
  • @Rob Penridge,您可能错过了 OP 认为这个答案是正确的,所以我的解决方案有所帮助。另外,我从来没有说过添加句点是必要的,所以看起来你没有对我的回答给予足够的重视。至于实践,当您添加句点 ALWAYS 时,您无需记住何时需要,而且您可以肯定,其他使用您的代码的人也不需要。奇怪的是,您在“多年”练习中没有抓住它。更重要的是,仅仅因为它与您的不同而对正确答案投反对票只是表示您不了解 SO 规则。
  • @WojtusJ 我标记了您的解决方案,因为它不能解决 OP 所说的问题,并且对以后遇到相同问题的人没有用处。如果您不相信,请随时调整您的答案以证明这一点,我会很高兴地支持它。是的,OP 确实将您的答案标记为正确,但我确信这不是第一次(也不会是最后一次)错误的答案被标记为正确。您确实说过添加分隔符是必要的,并引用您的回答:“您必须使用分隔符”。
【解决方案2】:

我不得不说我对您对错误的介绍以及您接受的答案感到有些困惑。根据我的经验,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 之后)。

【讨论】:

  • 是的,乔,看来你是对的。要重新创建该错误,您需要提交缺少分号的代码,再次提交,然后提交任何有效的 SAS 代码。这将重现 OP 所述的错误。
  • 同意,你是对的 - 我错过了那个分号,这可能是这种情况下的问题。如果你不介意,我也会在我的回答中引用。
  • 谢谢乔!您对错误顺序的分析(错误消息出现在 INCLUDE 语句之前)很准确。我的一位同事向我指出了这一点,由于我的问题得到了解决,我想感谢那些花时间帮助我的人。当时,@WojtusJ 得到了最有用和最详细的回复,因此我将其标记为正确(我不知道 '.' 变量名称分隔符)。在社区的进一步讨论和对所提问题的正确答案之后,我已将我接受的答案更改为这个答案。感谢大家的帮助!
【解决方案3】:

我怀疑您的代码中在此语句之前的某个地方还有另一个错误。尝试重新启动 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 足够聪明,知道 \ 字符不能是宏名称的一部分,因此无需使用 @987654326 显式声明宏的结尾@ 字符。

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

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";

【讨论】:

  • 尊敬的先生,您是否 100% 确定“SAS 足够聪明,知道 \ 字符不能成为宏名称的一部分”这句话适用于所有编码配置? SAS 有那么聪明吗?
  • 当 SAS 不在 A-Za-z0-9_ 中时,它会识别宏的结尾——这是默认设置。我不同意不使用 terminating 。 (我认为它有助于可读性)但我同意这不是上面发布的错误的具体原因,除非 OP 没有说什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-20
  • 2016-09-19
  • 2021-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多