楼主: bobguy
2520 3

[原创博文] 'shape' a macro variable into a desired look [推广有奖]

学科带头人

7%

还不是VIP/贵宾

-

威望
0
论坛币
14187 个
通用积分
28.9279
学术水平
344 点
热心指数
363 点
信用等级
228 点
经验
104882 点
帖子
1846
精华
0
在线时间
1608 小时
注册时间
2008-7-18
最后登录
2019-3-8

中级热心勋章

楼主
bobguy 发表于 2010-1-27 08:57:08 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
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));
二维码

扫码加我 拉你入群

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

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

关键词:Variable desired Desire Macro Shape desired modify single treat

已有 2 人评分学术水平 热心指数 信用等级 收起 理由
novice505 + 1 精彩帖子
leedx + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 2  热心指数 + 1  信用等级 + 1   查看全部评分

本帖被以下文库推荐

沙发
soporaeternus2 发表于 2010-1-27 10:13:19
很实用的宏,是不是楼主处理变量名时总结出来的啊......
好好学习

藤椅
librarynow 发表于 2010-7-13 02:44:08
Hi bobguy:
Thanks for sharing! This is great!

板凳
leedx 发表于 2011-8-24 08:54:07
多谢LZ,很实用的程序~~~

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-7 04:33