SAS%QUOTE与%BQUOTE

问题描述

我读到某个地方(我再也找不到了……),SAS%bquote函数解决了%quote函数中的一些小问题,并且它更健壮。是真的吗%quote有什么问题? 预先感谢

解决方法

恕我直言,当您需要显示(通过 PUT 或 TITLE)包含括在括号内的文本的句子时,%QUOTE 仍然很有用,而该文本太长而无法在一行中显示。 在这种情况下,您可能会将此文本分配在两行连续的行中:当左括号位于第一行时,右括号位于第二行。 在 %BQUOTE 标记之后紧跟在 '(' 之后出现的 '(' 似乎干扰了 %BQUOTE(见下文,我的示例代码)。 另一方面,%QUOTE 函数可以正常工作,前提是在每个独立的括号前都放了一个 % 符号。

DATA _NULL_; * %BQUOTE treats correctly a pair of parentheses,and an isolated closing parenthesis as well;
  FILE PRINT;
  %LET two_parentheses=%BQUOTE(... (text enclosed within parentheses) ....); 
  PUT "&two_parentheses"; 
  %LET closing_p_only=%BQUOTE(end of text enclosed within parentheses)...); 
  PUT "&closing_p_only"; 
RUN;

DATA _NULL_; * for opening parenthesis,%BQUOTE does not work ;
  FILE PRINT;
  %LET opening_p_only=%BQUOTE(... (beginning of text enclosed within parentheses); 
  PUT "&opening_p_only"; 
RUN;
  • 它不会向输出窗口发送任何信息,不会向日志窗口发送警告或错误消息,并且 SAS 不再工作。 如果您现在提交正确的代码部分,可能会显示以下消息:

    ERROR: Expected open parenthesis after macro function name not found.
    ERROR: Open code statement recursion detected.
    
  • 为了恢复,提交以下小(不是魔术,因为我们猜SAS在等待什么)链:);运行;

  • 我的解决方案:将 %QUOTE(...%(....) 替换为 %BQUOTE(.....(....);

DATA _NULL_;
  FILE PRINT;
  %LET opening_p_only=%QUOTE(... %(beginning of text enclosed within parentheses); 
  PUT "&opening_p_only"; 
RUN;

我的初步结论是,只要我们不知道如何使用 %BQUOTE 函数来处理左括号,我们就不应该忘记 %QUOTE 函数。

但是,也许,我想念 %BQUOTE() 已经能够处理的内容。

,

%QUOTE 在现代 SAS 中实际上没有任何用途 - %BQUOTE 在任何典型用法中取代它。根据 Summary of Macro Quoting Functions,唯一的区别是 %BQUOTE 会自动屏蔽单个不匹配的引号和括号,而 %QUOTE 需要一个 % 字符来屏蔽它们。

理论上,如果您希望 SAS 在遇到不匹配的引号时有效崩溃,那么 %QUOTE 会有一些价值 - 但这确实不是一个好主意,特别是因为 SAS 没有健壮的 {{1 }} 方法;它只会让 SAS 崩溃。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...