【问题标题】:SAS ODS escape character macro variable errorSAS ODS 转义字符宏变量错误
【发布时间】:2015-02-09 17:14:47
【问题描述】:

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 语句本身是有效的,因此放置一个空变量应该不是问题。

我们将不胜感激。

【问题讨论】:

    标签: sas sas-macro


    【解决方案1】:

    发生的事情是转义字符似乎需要一个右括号。例如:

    %put %superq(SYSODSESCAPECHAR););
    

    ;

    它转义了 ) ,这意味着你现在有了

    %put superq(;);
    

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

    %put &SYSODSESCAPECHAR.)x;
    

    x

    例如,这行得通。我不确定它是否只是关闭paren或其他也可以让它停止尝试逃跑的东西,但这是我唯一能说的有效。

    可以在SASHELP.VMACRO中查看宏变量的实际值;它不是 ' '(即使使用 SYMGET,这确实是传递给数据步骤的内容,但它已被明确解析)。在该表中,它是 '03'x,它在字符的上半部分看起来像一个大写 L。那是“文本结束”控制字符。我怀疑在文本中(在宏变量中)使用 this 时编辑器中的行为只是编辑器的行为 - '03'x 在许多编辑器上是不可表示的(例如,如果我尝试将它粘贴到这里,它是'不显示,但确实存在,我可以用零宽度退格)。 SAS 显然能够处理“普通”ods 转义字符,但不能以相同的方式处理“03”x。

    【讨论】:

    • 谢谢,乔。需要注意的是,如果我将 ODS ESCAPECHAR 分配给默认值以外的值,您指出的是 '03'x,使用 %superq(sysodsescapechar);); 会在第二个关闭括号上给我一个错误。此外,如果我使用默认值以外的其他内容,我的原始语句不会出现递归错误。
    • 另外让我觉得有趣的是 SAS 不能像你说的那样处理 '03'x,但它是默认的转义字符......
    • 当然,如果它被分配给某个东西,你会在第二个关闭括号上得到一个错误;您可以执行%put %superq(sysodsescapechar);*); 之类的操作(添加一个星号,如果定义正确,它将成为注释)。 SAS 当然可以在 SAS 引擎中处理 '03'x - 我相信是编辑器没有正确处理它。
    • 不会是日志处理不当吧?为什么是编辑器?
    • 不,日志本身不能产生错误。我可能不应该说编辑器,因为从技术上讲,编辑器看不到该符号;它可能是被绊倒的宏处理器。我不确定。但它是 SAS 语言编译器或之前的东西,我的感觉是它不是语言编译器本身 - 它是文字扫描器或宏处理器,很可能是其中一个或另一个没有正确处理 '03'x 字符(或以应有的方式处理它 - 这是一个控制字符,因此可能存在一些旧的大型机)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多