make your macro great from the very beginning · 16 complex macro parameters sort several datasets...
TRANSCRIPT
![Page 1: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/1.jpg)
PhUSE EU Connect 2018, Frankfurt
Make Your Macro Great from the
Very Beginning
Yuliia Bahatska Vladlen Ivanushkin
Syneos Health DataFocus
![Page 2: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/2.jpg)
2
INTRODUCTION
This is me when I think of my first macro
![Page 3: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/3.jpg)
3
THE COUNTW FUNCTION
%subgroup_analysis(data=data1, subgroup=subgroup1);
%subgroup_analysis(data=data1, subgroup=subgroup2);
%subgroup_analysis(data=data1, subgroup=subgroup3);
…who knows how many more macro calls
%subgroup_analysis(data=data1, subgroups=subgroup1 subgroup2 subgroup3 …);
![Page 4: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/4.jpg)
4
THE COUNTW FUNCTION
%subgroup_analysis(data=data1, subgroup=subgroup1);
%subgroup_analysis(data=data1, subgroup=subgroup2);
%subgroup_analysis(data=data1, subgroup=subgroup3);
…who knows how many more macro calls
%subgroup_analysis(data=data1, subgroups=subgroup1 subgroup2 subgroup3 …);
%macro subgroup_analysis(data=, subgroups=); %local subgroup i;%do i=1 %to %sysfunc(countw(&subgroups));
%let subgroup=%scan(&subgroups, &i);
<Code that needs to be repeated for each value of subgroup.>
%end;%mend subgroup_analysis;
![Page 5: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/5.jpg)
5
THE COUNTW FUNCTION
%subgroup_analysis(data=data1, subgroup=subgroup1);
%subgroup_analysis(data=data1, subgroup=subgroup2);
%subgroup_analysis(data=data1, subgroup=subgroup3);
…who knows how many more macro calls
%subgroup_analysis(data=data1, subgroups=subgroup1 subgroup2 subgroup3 …);
%macro subgroup_analysis(data=, subgroups=); %local subgroup i;%do i=1 %to %sysfunc(countw(&subgroups)); counts words in &subgroups
%let subgroup=%scan(&subgroups, &i); gets the &ith word from &subgroups
<Code that needs to be repeated for each value of subgroup.>
%end;%mend subgroup_analysis;
![Page 6: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/6.jpg)
6
THE GETOPTION FUNCTION
Who changedmy sessionsettings?!
![Page 7: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/7.jpg)
7
THE GETOPTION FUNCTION
%local l_pagesize;
%let l_pagesize= %sysfunc(getoption(PAGESIZE)); save option
Do whatever you need with it, e.g.:
options pagesize=60;
Change it back:
options pagesize=&l_pagesize;
![Page 8: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/8.jpg)
8
THE GETOPTION FUNCTION
%local l_pagesize;
%let l_pagesize= %sysfunc(getoption(PAGESIZE)); save option
Do whatever you need with it, e.g.:
options pagesize=60;
Change it back:
options pagesize=&l_pagesize;
proc datasets memtype=data nolist nowarn;
delete _temp: <names of all macro-created temporary datasets>;
quit;
%end;
%if &delete_temp_datasets=1 %then %do;
![Page 9: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/9.jpg)
9
THE REGULAR EXPRESSIONSCHANGING DELIMITERS IN A STRING
byvar=var1 var2 var3_2 var23
proc something...; proc sql;
by &byvar; &byvar ...by &byvar;
run; quit;
%let supp_byvar=%sysfunc(prxchange(s/\s+/%str(,)/, -1, &byvar));
supp_byvar=var1,var2,var3_2,var23
proc sql;
&supp_byvar ...by &supp_byvar;
quit;
![Page 10: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/10.jpg)
10
THE REGULAR EXPRESSIONSSEARCHING WORDS IN A STRING
%let words=WORD1 WORD2 ... WORDN;
%do counter=1 %to %sysfunc(countw(&words));%let word=%scan(&words, &counter);%if %sysfunc(findw(&string, &word)) %then %let wrd_ex_loop=YES;
%end;
%if %sysfunc(prxmatch(/\b(WORD1|WORD2|...|WORDN)\b/, &string))
%if %sysfunc(findw(&string, WORD1)) or %sysfunc(findw(&string, WORD2)) or … or %sysfunc(findw(&string, WORDN)) …
OR
![Page 11: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/11.jpg)
11
THE REGULAR EXPRESSIONSSEARCHING WORDS IN A STRING
%let words=WORD1 WORD2 ... WORDN;
%do counter=1 %to %sysfunc(countw(&words));%let word=%scan(&words, &counter);%if %sysfunc(findw(&string, &word)) %then %let wrd_ex_loop=YES;
%end;
%if %sysfunc(prxmatch(/\b(WORD1|WORD2|...|WORDN)\b/, &string))
%if %sysfunc(findw(&string, WORD1)) or %sysfunc(findw(&string, WORD2)) or … or %sysfunc(findw(&string, WORDN)) …
OR
✓ more convenient
✓ more flexible
✓ less code
✓ easier to understand
![Page 12: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/12.jpg)
12
THE REGULAR EXPRESSIONSSUBTRACTION OF TWO STRINGS
%let text=WORD1 WORD2 WORD3 WORD4 WORD5;%let words_to_ignore=WORD4 WORD1;
![Page 13: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/13.jpg)
13
THE REGULAR EXPRESSIONSSUBTRACTION OF TWO STRINGS
%let text=WORD1 WORD2 WORD3 WORD4 WORD5;%let words_to_ignore=WORD4 WORD1;
/*Insert | symbols to use in regular expression*/%let words_to_ignore_del=%sysfunc(prxchange(s/\s+/|/, -1, &words_to_ignore));
![Page 14: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/14.jpg)
14
THE REGULAR EXPRESSIONSSUBTRACTION OF TWO STRINGS
%let text=WORD1 WORD2 WORD3 WORD4 WORD5;%let words_to_ignore=WORD4 WORD1;
/*Insert | symbols to use in regular expression*/%let words_to_ignore_del=%sysfunc(prxchange(s/\s+/|/, -1, &words_to_ignore));%put NOTE: Result - %cmpres(%sysfunc(prxchange(s/\b(&words_to_ignore_del)\b//, -1, &text)));
Exclude all words given in &words_to_ignore from &text
![Page 15: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/15.jpg)
15
THE REGULAR EXPRESSIONSSUBTRACTION OF TWO STRINGS
%let text=WORD1 WORD2 WORD3 WORD4 WORD5;%let words_to_ignore=WORD4 WORD1;
/*Insert | symbols to use in regular expression*/%let words_to_ignore_del=%sysfunc(prxchange(s/\s+/|/, -1, &words_to_ignore));%put NOTE: Result - %cmpres(%sysfunc(prxchange(s/\b(&words_to_ignore_del)\b//, -1, &text)));
Exclude all words given in &words_to_ignore from &text
![Page 16: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/16.jpg)
16
COMPLEX MACRO PARAMETERS
Sort several datasets in the same way with some exception, for instance:
▪ Datasets DATA1-DATA5 need to be sorted datasets = DATA1 DATA2 DATA3 DATA4 DATA5
▪ DATA1, DATA2, DATA4 by VAR1 VAR2 sort_vars = VAR1 VAR2
▪ DATA3 by VAR1 VAR3
▪ DATA5 by VAR2 VAR4
%sort_variables(datasets = DATA1 DATA2 DATA3 DATA4 DATA5,sort_vars = VAR1 VAR2,exception = DATA3: VAR1 VAR3#DATA5: VAR2 VAR4)
exception = DATA3: VAR1 VAR3#DATA5: VAR2 VAR4
![Page 17: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/17.jpg)
17
COMPLEX MACRO PARAMETERS
%macro sort_variables(datasets=, sort_vars=, exception=);<For each single word in &datasets:>%if %index(&exception, &dataset.:) %then %do;
<If “word:” is contained in &exception then get respective sorting variables from &exception>
%let _sort_except=%sysfunc(prxchange(s/.*&dataset.://, 1, &exception));
%let sort_except=%scan(&_sort_except, 1, #);
%end;%else %let sort_except=;
![Page 18: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/18.jpg)
18
COMPLEX MACRO PARAMETERS
%macro sort_variables(datasets=, sort_vars=, exception=);<For each single word in &datasets:>%if %index(&exception, &dataset.:) %then %do;
<If “word:” is contained in &exception then get respective sorting variables from &exception>
%let _sort_except=%sysfunc(prxchange(s/.*&dataset.://, 1, &exception));DATA3: VAR1 VAR3#DATA5: VAR2 VAR4 VAR1 VAR3#DATA5: VAR2 VAR4
%let sort_except=%scan(&_sort_except, 1, #);VAR1 VAR3#DATA5: VAR2 VAR4 VAR1 VAR3
%end;%else %let sort_except=;
![Page 19: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/19.jpg)
19
COMPLEX MACRO PARAMETERS
%macro sort_variables(datasets=, sort_vars=, exception=);<For each single word in &datasets:>%if %index(&exception, &dataset.:) %then %do;
<If “word:” is contained in &exception then get respective sorting variables from &exception>
%let _sort_except=%sysfunc(prxchange(s/.*&dataset.://, 1, &exception));DATA3: VAR1 VAR3#DATA5: VAR2 VAR4 VAR1 VAR3#DATA5: VAR2 VAR4
%let sort_except=%scan(&_sort_except, 1, #);VAR1 VAR3#DATA5: VAR2 VAR4 VAR1 VAR3
%end;%else %let sort_except=;
proc sort data=&dataset out=&dataset._srt;by %sysfunc(coalescec(&sort_except, &sort_vars));
run;%mend sort_variables;
![Page 20: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/20.jpg)
20
MACRO QUOTING/UNQUOTINGMACRO VARIABLE NOT RESOLVED AT MACRO EXECUTION
%macro print_note(data=, footnote=text from the dataset - %nrstr(&studyid));proc sql;
select studyid into: studyid from &data;quit;
/* UNQUOTE should be used to resolve the previously quoted macro parameter*/%put NOTE: %unquote(&footnote);
%mend print_note;
![Page 21: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/21.jpg)
21
MACRO QUOTING/UNQUOTINGMACRO VARIABLE NOT RESOLVED AT MACRO EXECUTION
%macro print_note(data=, footnote=text from the dataset - %nrstr (&studyid));proc sql;
select studyid into: studyid from &data;quit;
/* UNQUOTE should be used to resolve the previously quoted macro parameter*/%put NOTE: %unquote(&footnote);
%mend print_note;
Not resolved yet
![Page 22: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/22.jpg)
22
MACRO QUOTING/UNQUOTINGMACRO VARIABLE NOT RESOLVED AT MACRO EXECUTION
%macro print_note(data=, footnote=text from the dataset - %nrstr (&studyid));proc sql;
select studyid into: studyid from &data;quit;
/* UNQUOTE should be used to resolve the previously quoted macro parameter*/%put NOTE: %unquote(&footnote);
%mend print_note;
Not resolved yet
Is resolved here
![Page 23: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/23.jpg)
23
MACRO QUOTING/UNQUOTINGMACRO VARIABLE NOT RESOLVED AT MACRO EXECUTION
%macro print_note(data=, footnote=text from the dataset - %nrstr (&studyid));proc sql;
select studyid into: studyid from &data;quit;
/* UNQUOTE should be used to resolve the previously quoted macro parameter*/%put NOTE: %unquote(&footnote);
%mend print_note;
data data1;studyid='12345';
run;
%print_note(data=data1, footnote = text from the dataset - %nrstr(&studyid));
Not resolved yet
Is resolved here
![Page 24: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/24.jpg)
24
MACRO QUOTING/UNQUOTINGMACRO VARIABLE NOT RESOLVED AT MACRO EXECUTION
%macro print_note(data=, footnote=text from the dataset - %nrstr (&studyid));proc sql;
select studyid into: studyid from &data;quit;
/* UNQUOTE should be used to resolve the previously quoted macro parameter*/%put NOTE: %unquote(&footnote);
%mend print_note;
data data1;studyid='12345';
run;
%print_note(data=data1, footnote = text from the dataset - %nrstr(&studyid));
NOTE: text from the dataset – 12345
Not resolved yet
Is resolved here
![Page 25: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/25.jpg)
25
MACRO QUOTING/UNQUOTINGMACRO VARIABLE NOT RESOLVED AT MACRO EXECUTION
%macro print_note(data=, footnote=text from the dataset - %nrstr (&studyid));proc sql;
select studyid into: studyid from &data;quit;
/* UNQUOTE should be used to resolve the previously quoted macro parameter*/%put NOTE: %unquote(&footnote);
%mend print_note;
data data1;studyid='12345';
run;
%print_note(data=data1, footnote = text from the dataset - %nrstr(&studyid));
NOTE: text from the dataset – 12345
NOTE: text from the dataset - &studyid
Not resolved yet
Is resolved here
![Page 26: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/26.jpg)
26
MACRO QUOTING/UNQUOTINGMACRO VARIABLE NOT RESOLVED AT MACRO EXECUTION
%macro print_note(data=, footnote=text from the dataset - %nrstr (&studyid));proc sql;
select studyid into: studyid from &data;quit;
/* UNQUOTE should be used to resolve the previously quoted macro parameter*/%put NOTE: %unquote(&footnote);
%mend print_note;
data data1;studyid='12345';
run;
%print_note(data=data1, footnote = text from the dataset - %nrstr(&studyid));
NOTE: text from the dataset – 12345
NOTE: text from the dataset - &studyid
%print_note(data=data1, footnote = text from the dataset - %nrstr(&studyid));WARNING: Apparent symbolic reference STUDYID not resolved.
Not resolved yet
Is resolved here
![Page 27: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/27.jpg)
27
MACRO PARAMETER CHECKS
In the beginning of the macro set some variable, i.e. param_error to 0:
Perform the checks, i.e.
Check whether a dataset/directory/library/format exists
Check whether a variable specified in a parameter is of required type. Like NUMBER, YESNO, CHAR
etc.
Check if a variable exists in a dataset (if the source dataset is known) etc.
If a check fails then
Provide informative message to the log for all failed checks
set param_error to 1 and
After all checks have run, see if any check failed and if yes, abort macro
execution
%if ¶m_error=1 %then %do;
%put ERROR: The macro terminated due to errors in the macro parameters;
%goto exit;
%end;
![Page 28: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/28.jpg)
28
MACRO PARAMETER CHECKSSTANDARDIZATION OF MACRO PARAMETER VALUES
Omiting not intended letter case issues %UPCASE
Omiting redundant blanks %CMPRES
Harmonizing values YES Y, NO N
etc.
![Page 29: Make Your Macro Great from the Very Beginning · 16 COMPLEX MACRO PARAMETERS Sort several datasets in the same way with some exception, for instance: Datasets DATA1-DATA5 need to](https://reader034.vdocuments.net/reader034/viewer/2022051921/600e4baa17217153e10118db/html5/thumbnails/29.jpg)
29
CONCLUSION
Great Macro
COUNTW, QUOTING
THE GETOPTION FUNCTION
RESTORING SESSION
REGULAR EXPRESSIONS
PARAMETER CHECKS