-
Notifications
You must be signed in to change notification settings - Fork 22
/
splitmac.sas
107 lines (93 loc) · 4.02 KB
/
splitmac.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
102
103
104
105
106
/*<pre><b>
/ Program : splitmac.sas
/ Version : 1.0
/ Author : Roland Rashleigh-Berry (http://www.datasavantconsulting.com/roland/)
/ Date : 08-May-2011
/ Purpose : Function-style macro to insert split characters in a macro string
/ SubMacros : none
/ Notes : This is the sister macro to %splitmac except it works on macro
/ values instead of SAS variables. It is a function-style macro.
/
/ A split character will normally be placed in a blank space. If
/ there is no suitable space then it will be inserted after a hyphen.
/ But if there is no suitable space and no hyphen then it will be
/ inserted at the end.
/
/ This macro will only look back the floor of half the column width
/ to find a place to insert the split character.
/
/ If the input string has one or more equals signs in it then
/ enclose the string in %str(). If it has one or more commas in it
/ then enclose it in %quote().
/
/ Usage : %let str=The quick brown fox jumped over the lazy dog;
/ %let splitstr=%splitmac(&str,10);
/ %put %splitmac(The quick brown fox jumped over the lazy dog,10);
/===============================================================================
/ PARAMETERS:
/-------name------- -------------------------description------------------------
/ str (pos) Macro string to split.
/ cols (pos) Maximum number of columns allowed.
/ split=* Split character. Must be a single character, unquoted.
/===============================================================================
/ AMENDMENT HISTORY:
/ init --date-- mod-id ----------------------description------------------------
/ rrb 13Feb07 "macro called" message added
/ rrb 30Jul07 Header tidy
/ rrb 08May11 Code tidy
/===============================================================================
/ This is public domain software. No guarantee as to suitability or accuracy is
/ given or implied. User uses this code entirely at their own risk.
/=============================================================================*/
%macro splitmac(str,cols,split=*);
%local errflag err _cols tempstr res;
%let err=ERR%str(OR);
%let errflag=0;
%if not %length(&str) %then %do;
%let errflag=1;
%put &err: (splitmac) No string supplied as first positional parameter;
%end;
%if not %length(&cols) %then %do;
%let errflag=1;
%put &err: (splitmac) No column width supplied as second positional parameter;
%end;
%else %if %sysfunc(verify(&cols,1234567890)) %then %do;
%let errflag=1;
%put &err: (splitmac) Cols parameter "&cols" not a valid number of columns;
%end;
%if not %length(&split) %then %let split=*;
%if %length(&split) GT 1 %then %do;
%let errflag=1;
%put &err: (splitmac) Split character &split is not a single unquoted character;
%end;
%if &errflag %then %goto exit;
%let tempstr=&str;
%do %while(%length(&tempstr) GT &cols);
%do _cols=(&cols+1) %to %eval(&cols/2) %by -1;
%if "%qsubstr(%quote(&tempstr),&_cols,1)" EQ " " %then %do;
%let res=&res%qsubstr(%quote(&tempstr),1,%eval(&_cols - 1))&split;
%let tempstr=%qsubstr(%quote(&tempstr),%eval(&_cols+1));
%let _cols=1;
%end;
%end;
%*- if space character not found look for a hyphen -;
%if &_cols GT 1 %then %do;
%do _cols=&cols %to %eval(&cols/2) %by -1;
%if "%qsubstr(%quote(&tempstr),&_cols,1)" EQ "-" %then %do;
%let res=&res%qsubstr(%quote(&tempstr),1,&_cols)&split;
%let tempstr=%qsubstr(%quote(&tempstr),%eval(&_cols+1));
%let _cols=1;
%end;
%end;
%end;
%*- if no hyphen found then split at end -;
%if &_cols GT 1 %then %do;
%let res=&res%qsubstr(%quote(&tempstr),1,&cols)&split;
%let tempstr=%qsubstr(%quote(&tempstr),&cols+1);
%end;
%end;
&res&tempstr
%goto skip;
%exit: %put &err: (splitmac) Leaving macro due to problem(s) listed;
%skip:
%mend splitmac;