【问题标题】:SAS Semicolon In MAcro variable宏变量中的 SAS 分号
【发布时间】:2014-12-23 12:24:34
【问题描述】:

我正在尝试创建一个包含稍后在数据步骤中执行的字符串的宏变量。我遇到的问题是我需要宏变量包含分号。以下不起作用。如何在此变量声明中添加分号?

    %let commandString='';

    data _null_;
    set DATA;

    if decile =1 then call symput('commandString', cat(&commandString, " if p_adj >", min, " then decile_ =1" , %str(;) ) ) ;

    run;

%put &commandString 

添加:

这就是我希望发生的事情。我希望结果是

First Part; Second Part;

但它不起作用。

%let commandString=%nrstr('First Part';);

data _null_;
call symput('commandString',cat(&commandString,%nrstr('Second Part';)) ;
run;

%put &commandString; 

【问题讨论】:

  • 你想做什么?
  • 最后,我想创建一个宏变量,该变量具有用于对数值变量进行分箱的 if then 规则。例如:“如果 p_adj >= 0.025 and p
  • 我知道这不能回答您的问题,但这通常不是进行重新编码/分箱的好方法。如果您提供更多详细信息,也许会有更简单的解决方案。如果您想坚持使用这种方法,我相信其他人会有答案。

标签: sas


【解决方案1】:

由于您没有提供可重现的代码,因此我对其进行了一些修改以测试其功能。

由于您想将分号(;) 分配给宏变量,因此您基本上是在要求 SAS 以不同的方式处理它,因为您必须使用称为的 屏蔽函数之一 - %nrstr - 在宏编译期间屏蔽特殊字符,包括 & 和 %,以及常量文本中的助记符

http://support.sas.com/documentation/cdl/en/mcrolref/61885/HTML/default/viewer.htm#a000208352.htm

%let commandString=%nrstr('';);
data _null_;
%put &commandString ;
run;

编辑(问题已被编辑)

  1. 您的代码中单引号的位置错误,单引号也应该包含分号,因为您也想包含它们。
  2. 在调用符号部分中缺少一个括号。

修改后的代码

 %let commandString=%nrstr('First Part;');
    data _null_;
    call symput('commandString',cat(&commandString,%nrstr('Second Part;')));
    run;
    %put "&commandString";
    %put %nrquote(&commandString); 

由于命令字符串解析为包含分号 (;) 的值,因此为了使用 %put 函数打印它的值,您还必须对其进行屏蔽,否则会引发错误。在这里您可以使用 "" 将其视为字符串,或者您必须在解析时使用 %nrquote 来屏蔽分号


【讨论】:

  • 这是否允许连接一个';'到宏变量字符串的末尾?
  • 我已添加到问题中。
  • 谢谢。当你做 %put &commandString;没有双引号 - 它不起作用。知道如何纠正吗?我想我需要消除引号,否则我无法在数据步骤中执行字符串:Data A; B组; &commandString;运行;
  • 您只需要使用%str()%quote(),除非您有一个包含& 或% 符号的字符串,否则使用它们的'nr' 版本是多余的。我相信将描述链接到这些功能会比链接“nr”描述更清晰。
猜你喜欢
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
相关资源
最近更新 更多