-
Notifications
You must be signed in to change notification settings - Fork 22
/
seplist.sas
102 lines (81 loc) · 2.34 KB
/
seplist.sas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/*
Purpose: Emit a list of items separated by some delimiter
example:
%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=$, [email protected], dlm=%str( ));
%put %seplist (a$b$c, indlm=$, prefix=antispam_, [email protected], 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 ));
Credit: Richard A. DeVenezia
http://www.devenezia.com/downloads/sas/macros/index.php?m=seplist
*/
%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;