【发布时间】:2014-04-18 01:06:38
【问题描述】:
假设我有一个宏变量 x,它可以包含任意数量的纯字母单词,每个单词由一个或多个空格分隔:
%let x = A B CD ;
我想创建另一个宏变量,在打印时会给出这个结果(单引号也可以换成双引号):
'A','B','CD'
它用于in() 语句...即。我想编写看起来像这样的代码:
data want;
set have;
where my_field in ( /* DO SOMETHING TO &X HERE TO GIVE DESIRED OUTPUT */ ) ;
run;
我正在寻找一种(最好是单行的)纯宏代码解决方案。不生成此注释的一个:
NOTE 49-169: The meaning of an identifier after a quoted string might change in a
future SAS release. Inserting white space between a quoted string and the succeeding
identifier is recommended.
到目前为止,我有这个:
%let y = %str(%')%sysfunc(tranwrd( %sysfunc(compbl(&x)) ,%str( ),%str(%',%') ))%str(%');
%put &y;
但我无法摆脱那个该死的音符。
【问题讨论】:
-
为什么要用宏语言做这个?这对我来说听起来像是数据操作。
-
答案已更新以解决您的问题。
&x中的值作为参数传递给 SAS。 -
难道您不能使用
indexw而不是in作为您的if 条件并获得相同的结果而不必担心插入大量引号吗?请参阅下面的答案。 -
@user667489 是的-鉴于我的原始示例代码,您是对的。这是一个不好的例子,因为我实际上应该在
where语句中使用它来利用索引。我现在已经修改了。不过感谢您的建议。