SAS ODS转义字符宏变量错误
SAS ODS escape character macro variable error
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;
如果宏变量实际为空,为什么会出现开放代码语句递归错误? %put
语句本身是有效的,因此放置一个空变量应该不是问题。
如有任何指导,我们将不胜感激。
发生的事情是转义字符似乎需要一个右括号。例如:
%put %superq(SYSODSESCAPECHAR););
;
它转义了 )
,这意味着现在你有
%put superq(;);
在你的第一个例子中,它有点棘手,因为分号本身似乎没有被转义,所以你必须提供一个右括号:
%put &SYSODSESCAPECHAR.)x;
x
例如,这行得通。我不确定它是否只是 close paren 或其他也可以让它停止尝试逃跑的东西,但这是我唯一能告诉你的作品。
可以看看SASHELP.VMACRO
中宏变量的实际值;它不是“”(即使使用 SYMGET,这确实是传递给数据步骤的内容,但它已被清楚地解析)。在那个 table 中它是 '03'x,它看起来像字符上半部分的大写 L。那就是 "End of Text" 控制字符。我怀疑在文本中(在宏变量中)使用它时编辑器中的行为只是编辑器的一种行为 - '03'x 在许多编辑器上不代表 table(如果我尝试将其粘贴到此处,例如,它没有显示,但确实存在,我可以用零宽度退格)。 SAS 显然能够处理 'normal' ods escapechar,但不能以相同的方式处理 '03'x。
SAS v9.4 文档列出了一个自动宏变量 &sysodsescapechar
,其中包含使用 ods escapechar=
.
每当我尝试使用 %put
语句查看宏变量时,我都会收到以下错误:
ERROR: Open code statement recursion detected.
当打开的代码错误地导致一个宏语句调用另一个宏语句时,就会发生这种情况。
我已经尝试了以下所有方法:
%put &=sysodsescapechar.;
%put %nrbquote(&sysodsescapechar.);
%put %superq(sysodsescapechar);
它们都会导致相同的错误。
当我尝试使用数据步骤查看宏变量时,它似乎是空的。
data test;
esc = "&sysodsescapechar.";
put esc=;
run;
如果宏变量实际为空,为什么会出现开放代码语句递归错误? %put
语句本身是有效的,因此放置一个空变量应该不是问题。
如有任何指导,我们将不胜感激。
发生的事情是转义字符似乎需要一个右括号。例如:
%put %superq(SYSODSESCAPECHAR););
;
它转义了 )
,这意味着现在你有
%put superq(;);
在你的第一个例子中,它有点棘手,因为分号本身似乎没有被转义,所以你必须提供一个右括号:
%put &SYSODSESCAPECHAR.)x;
x
例如,这行得通。我不确定它是否只是 close paren 或其他也可以让它停止尝试逃跑的东西,但这是我唯一能告诉你的作品。
可以看看SASHELP.VMACRO
中宏变量的实际值;它不是“”(即使使用 SYMGET,这确实是传递给数据步骤的内容,但它已被清楚地解析)。在那个 table 中它是 '03'x,它看起来像字符上半部分的大写 L。那就是 "End of Text" 控制字符。我怀疑在文本中(在宏变量中)使用它时编辑器中的行为只是编辑器的一种行为 - '03'x 在许多编辑器上不代表 table(如果我尝试将其粘贴到此处,例如,它没有显示,但确实存在,我可以用零宽度退格)。 SAS 显然能够处理 'normal' ods escapechar,但不能以相同的方式处理 '03'x。