seplist.sas
%macro seplist (
items
, indlm = %str( )
, dlm = %str(,)
, prefix=
, nest=
, suffix=
);
%* Richard A. DeVenezia - 990902;
%*
%* emit a list of words separated by a delimiter
%*
%* items - list of items, separated by indlm
%* indlm - string that delimits each item of items
%* dlm - string that delimits list of items emitted
%* prefix - string to place before each item
%* nest - Q (single quote ''),
%* QQ (double quotes ""),
%* P (parenthesis ()),
%* C (curly braces {}),
%* B (brackets [])
%* suffix - string to place after each item
%*
%* Note: nest is a convenience, and could be accomplished using
%* prefix and suffix
%*;
%local item n emit;
%let emit=;
%let nest = %upcase (&nest);
%if (&nest = Q) %then %do;
%let prefix = &prefix.%str(%');
%let suffix = %str(%')&suffix;
%end;
%else
%if (&nest = QQ) %then %do;
%let prefix = &prefix.%str(%");
%let suffix = %str(%")&suffix;
%end;
%else
%if (&nest = P) %then %do;
%let prefix = &prefix.%str(%();
%let suffix = %str(%))&suffix;
%end;
%else
%if (&nest = C) %then %do;
%let prefix = &prefix.%str({);
%let suffix = %str(})&suffix;
%end;
%else
%if (&nest = B) %then %do;
%let prefix = &prefix.%str([);
%let suffix = %str(])&suffix;
%end;
%let n = 1;
%let item = %qscan (&items, &n, %quote(&indlm));
%do %while (%superq(item) ne );
%if (&n = 1)
%then %let emit = &prefix.&item.&suffix;
%else %let emit = &emit.&dlm.&prefix.&item.&suffix;
%let n = %eval (&n+1);
%let item = %qscan (&items, &n, %quote(&indlm));
%end;
&emit
%mend; Sample code
/* options nosource; %put %seplist (a b c); %put %seplist (a b c, dlm=+); %put %seplist (a|b|c, indlm=|, dlm=%str( )); %put %seplist (a b c, prefix=ORACLE., nest=QQ); %put %seplist (a$b$c, indlm=$, suffix=@mail.com, dlm=%str( )); %put %seplist (a$b$c, indlm=$, prefix=antispam_, suffix=@mail.com, dlm=%str( )); %put %seplist (a b c, dlm=||, nest=Q); %put %seplist (a b c, nest=C); %put %seplist (a b c, nest=P); %put %seplist (a b c, nest=B); %put %seplist (a xyz b xyz c, indlm=xyz, dlm=%str( or ), prefix=%str( not )); */