SAS ODS转义字符宏变量错误

时间:2015-02-09 17:14:47

标签: sas sas-macro

SAS v9.4文档列出了一个自动宏变量&sysodsescapechar,其中包含使用ods escapechar=分配的当前ODS转义字符。

每当我尝试使用%put语句查看宏变量时,都会出现以下错误:

ERROR: Open code statement recursion detected.

当打开的代码错误地导致宏语句调用另一个宏语句时,会发生这种情况。

我尝试了以下所有方法:

%put &=sysodsescapechar.;
%put %nrbquote(&sysodsescapechar.);
%put %superq(sysodsescapechar);

它们都会导致同样的错误。

当我尝试使用数据步骤查看宏变量时,它似乎是空的。

data test;
    esc = "&sysodsescapechar.";
    put esc=;
run;

如果宏变量实际为空,为什么我会得到开放代码语句递归错误? <{1}}语句本身是有效的,所以放一个空变量应该不是问题。

非常感谢此处的任何指导。

1 个答案:

答案 0 :(得分:2)

正在发生的事情是,逃脱字符似乎需要一个紧密的括号。例如:

%put %superq(SYSODSESCAPECHAR););
  

它逃脱了),这意味着现在你已经

%put superq(;);

在你的第一个例子中,它有点棘手,因为分号本身似乎没有被转义,所以你必须提供一个紧密的括号:

%put &SYSODSESCAPECHAR.)x;
  

X

例如,这有用。我不确定它是否只是关闭paren或其他可以让它停止试图逃脱的东西,但这是我唯一能说的作品。

您可以在SASHELP.VMACRO中查看宏变量的实际值;它不是''(即使使用SYMGET,它确实会被传递到数据步骤,但它已被清楚地解析)。在该表中,它是'03'x,在角色的上半部分看起来像一个大写的L.这是“文本结束”控制字符。我怀疑在文本中使用它时(在宏变量中)编辑器中的行为只是编辑器的行为 - '03'x在许多编辑器中无法表示(如果我尝试将其粘贴到此处,例如,它不是没有显示,但确实存在,我可以退零,宽度为零)。 SAS显然能够处理'正常'的ods escapechar,但不能以同样的方式处理'03'x。