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

SAS: Delete missing items in a macro variable

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

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

我需要删除那些缺失的项目,即逗号之间的空白。最终输出应该像 A,B,C,D,G,I。可能吗? Trim 功能在这里似乎不起作用。我是 SAS 的新手,所以在这里将不胜感激任何帮助。谢谢

 %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的结果

仅供娱乐 - 纯宏正则表达式版本:

 %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;

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

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

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

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