SAS:删除宏变量中缺少的项目

时间:2019-06-28 05:00:51

标签: sas trim sas-macro

我有一个名为list1的宏变量,它给出:

%put &list1.;
A,B,C,D,,,G,,I,,

我需要删除那些缺失的项目,即逗号之间为空。最终输出应类似于A,B,C,D,G,I。可能吗?修剪功能在这里似乎不起作用。我是SAS的新手,因此在这里将对您有所帮助。谢谢。

3 个答案:

答案 0 :(得分:2)

 %let a= A,B,C,D,,,G,,I,,;


 data c;
 val = tranwrd(trim(compbl(tranwrd("&a",","," "))), " ",",");
 call symput('b',val);
  run;

%put &b;

A,B,C,D,G,I的结果

答案 1 :(得分:1)

只是为了好玩-纯宏正则表达式版本:

 %let a= A,B,C,D,,,G,,I,,;
 %let regex1 = %sysfunc(prxparse(%str(s/,+/,/)));
 %let b=%sysfunc(prxchange(&regex1,-1,%quote(&a)));

 %let regex2 = %sysfunc(prxparse(%str(s/,$//)));
 %let b=%sysfunc(prxchange(&regex2,-1,%quote(&b)));

 %put b= &b;

如果您不必在输入末尾处理尾随逗号,则可以跳过第二个正则表达式。

答案 2 :(得分:1)

您可以将逗号转换为空格,并使用COMPBL()折叠多个空格。然后将空格转换回逗号。如果您有空格,只需交换逗号和空格字符即可。

%let temp=%sysfunc(translate(%superq(list1),%str( ,),%str(, )));
%let temp=%sysfunc(compbl(%superq(temp)));
%let list2=%sysfunc(translate(%superq(temp),%str( ,),%str(, )));

PS 您通常不希望在宏变量中使用逗号作为定界符。由于使用逗号分隔参数值,因此很难将值传递给其他宏或函数。因此,此代码中的所有宏引用功能都起作用。对于变量列表,通常需要一个以空格分隔的列表,在该列表中多个相邻空格无关紧要。对于其他类型的列表,通常需要使用另一个定界符,例如|^