diff --git a/all.sas b/all.sas index 85d5229..a1e784e 100644 --- a/all.sas +++ b/all.sas @@ -2621,9 +2621,12 @@ Usage: @brief Returns words that are in both string 1 and string 2 @details Compares two space separated strings and returns the words that are in both. + + If either string is empty, nothing is returned. + Usage: - %put %mf_wordsInStr1andStr2( + %put %mf_wordsinstr1andstr2( Str1=blah sss blaaah brah bram boo ,Str2= blah blaaah brah ssss ); @@ -2641,34 +2644,26 @@ Usage: **/ -%macro mf_wordsInStr1andStr2( +%macro mf_wordsinstr1andstr2( Str1= /* string containing words to extract */ ,Str2= /* used to compare with the extract string */ )/*/STORE SOURCE*/; -%local count_base count_extr i i2 extr_word base_word match outvar; +%local count_extr i extr_word outvar; %if %length(&str1)=0 or %length(&str2)=0 %then %do; - %put base string (str1)= &str1; - %put compare string (str2) = &str2; + %put &sysmacroname: empty input string, nothing to compare; %return; %end; -%let count_base=%sysfunc(countw(&Str2)); %let count_extr=%sysfunc(countw(&Str1)); %do i=1 %to &count_extr; %let extr_word=%scan(&Str1,&i,%str( )); - %let match=0; - %do i2=1 %to &count_base; - %let base_word=%scan(&Str2,&i2,%str( )); - %if &extr_word=&base_word %then %let match=1; - %end; - %if &match=1 %then %let outvar=&outvar &extr_word; + %if %sysfunc(indexw(%superq(str2),%superq(extr_word)))>0 %then + %let outvar=&outvar &extr_word; %end; - - &outvar - -%mend mf_wordsInStr1andStr2; - +/* send out the result without any surrounding whitespace */ +%do;&outvar%end; +%mend mf_wordsinstr1andstr2; /** @file @brief Returns words that are in string 1 but not in string 2 @@ -2677,9 +2672,12 @@ Usage: Note - case sensitive! + If str1 is empty, nothing is returned. If str2 is empty, all the words in + str1 are returned. + Usage: - %let x= %mf_wordsInStr1ButNotStr2( + %let x= %mf_wordsinstr1butnotstr2( Str1=blah sss blaaah brah bram boo ,Str2= blah blaaah brah ssss ); @@ -2695,34 +2693,26 @@ Usage: **/ -%macro mf_wordsInStr1ButNotStr2( +%macro mf_wordsinstr1butnotstr2( Str1= /* string containing words to extract */ ,Str2= /* used to compare with the extract string */ )/*/STORE SOURCE*/; -%local count_base count_extr i i2 extr_word base_word match outvar; -%if %length(&str1)=0 or %length(&str2)=0 %then %do; - %put base string (str1)= &str1; - %put compare string (str2) = &str2; +%local count_extr i extr_word outvar; +%if %length(&str1)=0 %then %do; + %put &sysmacroname: str1 is empty, nothing to compare; %return; %end; -%let count_base=%sysfunc(countw(&Str2)); %let count_extr=%sysfunc(countw(&Str1)); %do i=1 %to &count_extr; %let extr_word=%scan(&Str1,&i,%str( )); - %let match=0; - %do i2=1 %to &count_base; - %let base_word=%scan(&Str2,&i2,%str( )); - %if &extr_word=&base_word %then %let match=1; - %end; - %if &match=0 %then %let outvar=&outvar &extr_word; + %if %sysfunc(indexw(%superq(str2),%superq(extr_word)))=0 %then + %let outvar=&outvar &extr_word; %end; - - &outvar - -%mend mf_wordsInStr1ButNotStr2; - +/* send out the result without any surrounding whitespace */ +%do;&outvar%end; +%mend mf_wordsinstr1butnotstr2; /** @file @brief Creates a text file using pure macro diff --git a/base/mf_wordsinstr1andstr2.sas b/base/mf_wordsinstr1andstr2.sas index 43949f5..bca241b 100644 --- a/base/mf_wordsinstr1andstr2.sas +++ b/base/mf_wordsinstr1andstr2.sas @@ -3,9 +3,12 @@ @brief Returns words that are in both string 1 and string 2 @details Compares two space separated strings and returns the words that are in both. + + If either string is empty, nothing is returned. + Usage: - %put %mf_wordsInStr1andStr2( + %put %mf_wordsinstr1andstr2( Str1=blah sss blaaah brah bram boo ,Str2= blah blaaah brah ssss ); @@ -23,31 +26,23 @@ **/ -%macro mf_wordsInStr1andStr2( +%macro mf_wordsinstr1andstr2( Str1= /* string containing words to extract */ ,Str2= /* used to compare with the extract string */ )/*/STORE SOURCE*/; -%local count_base count_extr i i2 extr_word base_word match outvar; +%local count_extr i extr_word outvar; %if %length(&str1)=0 or %length(&str2)=0 %then %do; - %put base string (str1)= &str1; - %put compare string (str2) = &str2; + %put &sysmacroname: empty input string, nothing to compare; %return; %end; -%let count_base=%sysfunc(countw(&Str2)); %let count_extr=%sysfunc(countw(&Str1)); %do i=1 %to &count_extr; %let extr_word=%scan(&Str1,&i,%str( )); - %let match=0; - %do i2=1 %to &count_base; - %let base_word=%scan(&Str2,&i2,%str( )); - %if &extr_word=&base_word %then %let match=1; - %end; - %if &match=1 %then %let outvar=&outvar &extr_word; + %if %sysfunc(indexw(%superq(str2),%superq(extr_word)))>0 %then + %let outvar=&outvar &extr_word; %end; - - &outvar - -%mend mf_wordsInStr1andStr2; - +/* send out the result without any surrounding whitespace */ +%do;&outvar%end; +%mend mf_wordsinstr1andstr2; diff --git a/base/mf_wordsinstr1butnotstr2.sas b/base/mf_wordsinstr1butnotstr2.sas index 17b8ae3..6a3e4bd 100755 --- a/base/mf_wordsinstr1butnotstr2.sas +++ b/base/mf_wordsinstr1butnotstr2.sas @@ -6,9 +6,12 @@ Note - case sensitive! + If str1 is empty, nothing is returned. If str2 is empty, all the words in + str1 are returned. + Usage: - %let x= %mf_wordsInStr1ButNotStr2( + %let x= %mf_wordsinstr1butnotstr2( Str1=blah sss blaaah brah bram boo ,Str2= blah blaaah brah ssss ); @@ -24,31 +27,23 @@ **/ -%macro mf_wordsInStr1ButNotStr2( +%macro mf_wordsinstr1butnotstr2( Str1= /* string containing words to extract */ ,Str2= /* used to compare with the extract string */ )/*/STORE SOURCE*/; -%local count_base count_extr i i2 extr_word base_word match outvar; -%if %length(&str1)=0 or %length(&str2)=0 %then %do; - %put base string (str1)= &str1; - %put compare string (str2) = &str2; +%local count_extr i extr_word outvar; +%if %length(&str1)=0 %then %do; + %put &sysmacroname: str1 is empty, nothing to compare; %return; %end; -%let count_base=%sysfunc(countw(&Str2)); %let count_extr=%sysfunc(countw(&Str1)); %do i=1 %to &count_extr; %let extr_word=%scan(&Str1,&i,%str( )); - %let match=0; - %do i2=1 %to &count_base; - %let base_word=%scan(&Str2,&i2,%str( )); - %if &extr_word=&base_word %then %let match=1; - %end; - %if &match=0 %then %let outvar=&outvar &extr_word; + %if %sysfunc(indexw(%superq(str2),%superq(extr_word)))=0 %then + %let outvar=&outvar &extr_word; %end; - - &outvar - -%mend mf_wordsInStr1ButNotStr2; - +/* send out the result without any surrounding whitespace */ +%do;&outvar%end; +%mend mf_wordsinstr1butnotstr2; diff --git a/tests/base/mf_wordsinstr1andstr2.test.sas b/tests/base/mf_wordsinstr1andstr2.test.sas index 38a3c55..917df29 100644 --- a/tests/base/mf_wordsinstr1andstr2.test.sas +++ b/tests/base/mf_wordsinstr1andstr2.test.sas @@ -5,12 +5,17 @@