百年孤独 发表于 2013-7-23 15:34

转载分享 SAS基础宏之2:SeparateString

这个宏用于得到由多个单词构成的(用空格分隔单词)宏变量的单词数目,并且把这些单词分别赋给一系列的宏变量
我写的宏中间的参数一般可设置多个数据集/变量,所以需要这个SeparateString把它拆分出来

%macro SeparateString(InputString,OutputString);
/**********************************************************************/
/* 此宏用于将含有一组单词的字符串拆分为一个个的单词,并将这些单词依次 */
/* 存放于一系列宏变量之中。注意,字符串中单词的定义为由字母、数字和下 */
/* 下划线组成的一个整体,而分隔符可以为除字母、数字、下划线以及逗号之 */
/* 外的其他任意字符。其中InputString是所选的字符串,OutputString是输 */
/* 出的字符串前缀,不需要加最后的下划线。 */
/* */
/* 最终得到的是一组单词的宏变量&OutputString._Var1,&OutputString.Var2 */
/* 等以及字符串所含单词数量的宏变量&OutputString._Num。 */
/* */
/* Created on 2012.9.18 */
/* Modified on 2012.12.6 */
/**********************************************************************/

data SS_temp;
Str="&InputString";
run;

data SS_temp;
set SS_temp;
Words=0;
do while(SCAN(Str,Words+1,' ') NE "");
Words+1;
end;
run;

%global &OutputString._Num;

proc sql noprint;
select Words into :&OutputString._Num from SS_Temp;
quit;

%do SS_i=1 %to &&&OutputString._Num;
%global &OutputString._Var&SS_i;
%let &OutputString._Var&SS_i.=%SYSFUNC(SCAN(&InputString,&SS_i,' '));
%end;

/* 去除&OutputString._Num前后的空格 */
%let &OutputString._Num=%SYSFUNC(TRIM(&&&OutputString._Num));

/* 删除不必要的表格 */
proc delete data=SS_temp;
run;

%mend;


%macro Demo();

%let InputString=12 -24;
%let OutputString=a;
%SeparateString(&InputString,&OutputString);

%put &a_Num;
%put &a_Var2;

%mend;

页: [1]
查看完整版本: 转载分享 SAS基础宏之2:SeparateString