全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2485 3
2010-01-27
Here is a small macro to  'shape' a macro variable into a desired look.
You can modify it according to your needs.

%macro stringit(varlist, fun=, affix=);
  %*utility to treat macro strings;
  %*fun=1 --- quote string and separated by ,;
  %*fun=101 --- single --quote string and separated by ,;
  %*fun=2 --- quote string and separated by a space;
  %*fun=3 --- add prefix  ;
  %*fun=4 --- add suffix ;
  %*fun=5 --- rename list prefix;
  %*fun=501 --- rename list suffix;
  %*fun=6 --- pair list variable +  variable prefix;
  %*fun=7 --- take away first n chars from a string(length(each word)>n);
  %*fun=8 --- keep first n chars from a string(length(each word)>n);

  %local varlist2 n cur_var l l2;
  %let n= %eval(%sysfunc(countc(%cmpres(&varlist),%str( )))+ (%length(&varlist)>0) );
  %let varlist2=;

   %if  &fun=1 %then %do;
   %do i = 1 %to &n;
     %let cur_var="%scan(&varlist,&i)";
     %if &i=1 %then %let varlist2=&varlist2 &cur_var;
     %else         %let varlist2=&varlist2,&cur_var;
   %end;
   %end;

   %else %if  &fun=101 %then %do;
    %do i = 1 %to &n;
     %let cur_var=%str(%')%scan(&varlist,&i)%str(%');
     %if &i=1 %then %let varlist2=&varlist2 &cur_var;
     %else         %let varlist2=&varlist2,&cur_var;
   %end;
   %end;

   %else %if  &fun=2 %then %do;
   %do i = 1 %to &n;
     %let cur_var="%scan(&varlist,&i)";
     %if &i=1 %then %let varlist2=&varlist2 &cur_var;
     %else         %let varlist2=&varlist2 &cur_var;
   %end;
   %end;

   %else %if  &fun=3 %then %do;
   %do i = 1 %to &n;
     %let cur_var=&affix.%scan(&varlist,&i);
     %if &i=1 %then %let varlist2=&varlist2 &cur_var;
     %else         %let varlist2=&varlist2 &cur_var;
   %end;
   %end;

   %else %if  &fun=4 %then %do;
   %do i = 1 %to &n;
     %let cur_var=%scan(&varlist,&i)&affix;
     %if &i=1 %then %let varlist2=&varlist2 &cur_var;
     %else         %let varlist2=&varlist2 &cur_var;
   %end;
   %end;

   %else %if  &fun=5 %then %do;
   %do i = 1 %to &n;
     %let cur_var=%scan(&varlist,&i)=&affix.%scan(&varlist,&i);
     %if &i=1 %then %let varlist2=&varlist2 &cur_var;
     %else         %let varlist2=&varlist2 &cur_var;
   %end;
   %end;

   %else %if  &fun=501 %then %do;
   %do i = 1 %to &n;
     %let cur_var=%scan(&varlist,&i)=%scan(&varlist,&i)&affix;
     %if &i=1 %then %let varlist2=&varlist2 &cur_var;
     %else         %let varlist2=&varlist2 &cur_var;
   %end;
   %end;

   %else %if  &fun=6 %then %do;
   %do i = 1 %to &n;
     %let cur_var=%scan(&varlist,&i) &affix.%scan(&varlist,&i);
     %if &i=1 %then %let varlist2=&varlist2 &cur_var;
     %else         %let varlist2=&varlist2 &cur_var;
   %end;
   %end;

   %else %if  &fun=7 %then %do;
   %do i = 1 %to &n;
     %let l=%eval(&affix+1);
     %let cur_var=%substr(%scan(&varlist,&i),&l);
     %if &i=1 %then %let varlist2=&varlist2 &cur_var;
     %else         %let varlist2=&varlist2 &cur_var;
   %end;
   %end;

   %else %if  &fun=8 %then %do;
   %do i = 1 %to &n;
     %let l=&affix;
         %let cur_var=%scan(&varlist,&i);
         %let l2=%length(&cur_var);
     %let cur_var=%substr(&cur_var,1,%eval(&l2-&l));
     %if &i=1 %then %let varlist2=&varlist2 &cur_var;
     %else         %let varlist2=&varlist2 &cur_var;
   %end;
%end;
&varlist2
%mend;

%let VARS=
ABCD EFGH AAC BBD CCE
;

%put %quote(%stringit(&VARS, fun=1));
%put %quote(%stringit(&VARS, fun=101));
%put %quote(%stringit(&VARS, fun=2));
%put %quote(%stringit(&VARS, fun=3,affix=QQ_));
%put %quote(%stringit(&VARS, fun=4,affix=_QQ));
%put %quote(%stringit(&VARS, fun=5,affix=QQ));
%put %quote(%stringit(&VARS, fun=501,affix=QQ));
%put %quote(%stringit(&VARS, fun=6,affix=QQ));
%put %quote(%stringit(&VARS, fun=7,affix=2));
%put %quote(%stringit(&VARS, fun=8,affix=2));
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2010-1-27 10:13:19
很实用的宏,是不是楼主处理变量名时总结出来的啊......
好好学习
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-7-13 02:44:08
Hi bobguy:
Thanks for sharing! This is great!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2011-8-24 08:54:07
多谢LZ,很实用的程序~~~
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群