diff --git a/all.sas b/all.sas
index 6c87bb8..e1571ba 100644
--- a/all.sas
+++ b/all.sas
@@ -2945,7 +2945,7 @@ run;
proc sql;
create table data1 as select * from sashelp.class;
create view view2 as select * from sashelp.class;
- %mp_dropmembers(libref=WORK, list=data1 view2)
+ %mp_dropmembers(data1 view2, libref=WORK)
SAS Macros
@@ -5729,7 +5729,15 @@ run;
%mp_searchcols(libs=sashelp work, cols=name sex age)
- @param libs=
+ @param libs=(SASHELP) Space separated list of libraries to search for columns
+ @param cols= Space separated list of column names to search for (not case
+ sensitive)
+ @param outds=(mp_searchcols) the table to create with the results. Will have
+ one line per table match.
+ @param match=(ANY) The match type. Valid values:
+ @li ANY - The table contains at least one of the columns
+ @li WILD - The table contains a column with a name that partially matches
+
@version 9.2
@author Allan Bowe
**/
@@ -5737,6 +5745,7 @@ run;
%macro mp_searchcols(libs=sashelp
,cols=
,outds=mp_searchcols
+ ,match=ANY
)/*/STORE SOURCE*/;
%put &sysmacroname process began at %sysfunc(datetime(),datetime19.);
@@ -5758,8 +5767,10 @@ create table _data_ as
%end;
order by 1,2,3;
+%local tempds;
+%let tempds=&syslast;
data &outds;
- set &syslast;
+ set &tempds;
length cols matchcols $32767;
cols=upcase(symget('cols'));
colcount=countw(cols);
@@ -5773,10 +5784,29 @@ data &outds;
retain matchcols;
matchcols='';
end;
+%if &match=ANY %then %do;
if findw(cols,name,,'spit') then do;
sumcols+1;
matchcols=cats(matchcols)!!' '!!cats(name);
end;
+%end;
+%else %if &match=WILD %then %do;
+ if _n_=1 then do;
+ retain wcount;
+ wcount=countw(cols);
+ drop wcount;
+ end;
+ do i=1 to wcount;
+ length curword $32;
+ curword=scan(cols,i,' ');
+ drop curword;
+ if index(name,cats(curword)) then do;
+ sumcols+1;
+ matchcols=cats(matchcols)!!' '!!cats(curword);
+ end;
+ end;
+%end;
+
if last.memname then do;
if sumcols>0 then output;
if sumcols=colcount then putlog "Full Match: " libname memname;
@@ -5786,10 +5816,11 @@ run;
proc sort; by descending sumcols memname libname; run;
+proc sql;
+drop table &tempds;
%put &sysmacroname process finished at %sysfunc(datetime(),datetime19.);
-%mend;
-/**
+%mend mp_searchcols;/**
@file
@brief Searches all data in a library
@details
diff --git a/base/mp_searchcols.sas b/base/mp_searchcols.sas
index fb25e48..d4cc087 100644
--- a/base/mp_searchcols.sas
+++ b/base/mp_searchcols.sas
@@ -9,7 +9,15 @@
%mp_searchcols(libs=sashelp work, cols=name sex age)
- @param libs=
+ @param libs=(SASHELP) Space separated list of libraries to search for columns
+ @param cols= Space separated list of column names to search for (not case
+ sensitive)
+ @param outds=(mp_searchcols) the table to create with the results. Will have
+ one line per table match.
+ @param match=(ANY) The match type. Valid values:
+ @li ANY - The table contains at least one of the columns
+ @li WILD - The table contains a column with a name that partially matches
+
@version 9.2
@author Allan Bowe
**/
@@ -17,6 +25,7 @@
%macro mp_searchcols(libs=sashelp
,cols=
,outds=mp_searchcols
+ ,match=ANY
)/*/STORE SOURCE*/;
%put &sysmacroname process began at %sysfunc(datetime(),datetime19.);
@@ -38,8 +47,10 @@ create table _data_ as
%end;
order by 1,2,3;
+%local tempds;
+%let tempds=&syslast;
data &outds;
- set &syslast;
+ set &tempds;
length cols matchcols $32767;
cols=upcase(symget('cols'));
colcount=countw(cols);
@@ -53,10 +64,29 @@ data &outds;
retain matchcols;
matchcols='';
end;
+%if &match=ANY %then %do;
if findw(cols,name,,'spit') then do;
sumcols+1;
matchcols=cats(matchcols)!!' '!!cats(name);
end;
+%end;
+%else %if &match=WILD %then %do;
+ if _n_=1 then do;
+ retain wcount;
+ wcount=countw(cols);
+ drop wcount;
+ end;
+ do i=1 to wcount;
+ length curword $32;
+ curword=scan(cols,i,' ');
+ drop curword;
+ if index(name,cats(curword)) then do;
+ sumcols+1;
+ matchcols=cats(matchcols)!!' '!!cats(curword);
+ end;
+ end;
+%end;
+
if last.memname then do;
if sumcols>0 then output;
if sumcols=colcount then putlog "Full Match: " libname memname;
@@ -66,6 +96,8 @@ run;
proc sort; by descending sumcols memname libname; run;
+proc sql;
+drop table &tempds;
%put &sysmacroname process finished at %sysfunc(datetime(),datetime19.);
-%mend;
+%mend mp_searchcols;
\ No newline at end of file
diff --git a/tests/base/mp_searchcols.test.sas b/tests/base/mp_searchcols.test.sas
new file mode 100644
index 0000000..4351280
--- /dev/null
+++ b/tests/base/mp_searchcols.test.sas
@@ -0,0 +1,50 @@
+/**
+ @file
+ @brief Testing mp_searchcols.sas
+
+ SAS Macros
+ @li mp_searchcols.sas
+ @li mp_assertdsobs.sas
+
+
+**/
+
+
+/** Test 1 - full col match */
+data example1;
+ var1=1;
+ var2=2;
+ var3=3;
+data example2;
+ var1=1;
+ var2=2;
+data example3;
+ var2=2;
+ var3=3;
+data example4;
+ matchmehere=1;
+data example5;
+ hereyoucan_matchme_also=1;
+data example6;
+ do_not_forget_me=1;
+data example7;
+ we_shall_not_forget=1;
+run;
+
+%mp_searchcols(libs=work,cols=var1 var2,outds=testme)
+
+%mp_assertdsobs(work.testme,
+ desc=Test1 - check exact variables are found,
+ test=EQUALS 3,
+ outds=work.test_results
+)
+
+/* test 2 - wildcard match */
+
+%mp_searchcols(libs=work,cols=matchme forget,match=WILD, outds=testme2)
+
+%mp_assertdsobs(work.testme2,
+ desc=Test1 - check fuzzy matches are found,
+ test=EQUALS 4,
+ outds=work.test_results
+)
\ No newline at end of file