fix: refactor of mf_wordsinstr1-xxx-str2 macros to support 000s of vals efficiently

This commit is contained in:
dcbot
2026-07-19 23:17:12 +01:00
parent a0146a1f91
commit 444ffac0f3
4 changed files with 216 additions and 35 deletions
+12 -17
View File
@@ -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;