From 05e892619afdab1988053e21e9f0df325d8f276b Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 19 Jul 2026 22:17:34 +0000 Subject: [PATCH] chore: updating all.sas --- all.sas | 68 ++++++++++++++++++++++++--------------------------------- 1 file changed, 28 insertions(+), 40 deletions(-) diff --git a/all.sas b/all.sas index 815f3b1..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 @@ -12372,12 +12362,10 @@ run; /* multiply-by-one for consistent cross-system precision. Ignore null to protect SAS special missing values. + Cannot use IFN() as it evaluates both sides */ - &normal = ifn( - missing(&nums[&i]), - &nums[&i], - &nums[&i] * 1 - ); + if missing(&nums[&i]) then &normal = &nums[&i]; + else &normal = &nums[&i] * 1; &numtext = put(&normal, binary64.); &digest = md5(trim(&numtext)); substr(&pair, 1, 16) = &state;