--- %%NOBANNER%% -->
/*-------------------<---Start of Description-->---------------------\
| Scan a string of word using a word or a substring as delimiter; |
|---------------------<---End of Description-->----------------------|
|--------------------------------------------------------------------|
|------------<---Start of Files or Arguments Needed-->---------------|
| Inputs: |
| _strx_ - the input string; |
| _cntx_ - the ith word; |
| _sepx_ - the delimiter; |
| note: it can take a string as a delimiter; |
|------------------<---End of Arguments Needed-->--------------------|
|--------------------------------------------------------------------|
|------------------<---Start of Files Created-->---------------------|
| Example: %let x=this,test is a test; |
| %put %sscan(%nrbquote(&x), 2, %str(is| |,)); |
| Usage: indexw(var,excerpt); |
\-------------------<---End of Files Created-->---------------------*/
%macro sscan(_strx_, _cntx_, _sepx_);
%let _specialchar_=ØÙÚÛÜÝÞßøùúûüýþÿñðæÖ;
%if (%words(%nrbquote(&_sepx_), dlm=%nrbquote(|)) le 1) %then %do;
%if (%length(&_sepx_) le 1) %then
%scan(%nrbquote(&_strx_), &_cntx_, %nrbquote(&_sepx_));
%else %do;
%let _strx_=%sysfunc(tranwrd(%nrbquote(&_strx_), %nrbquote(&_sepx_),%nrbquote(Ø)));
%scan(%nrbquote(&_strx_), &_cntx_, %nrbquote(Ø));
%end;
%end;
%else %do;
%let _wcounti_=0; %let _dlmx_=; %let _ispecialchar_=0;
%do %while(%length(%nrbquote(%scan(%nrbquote(&_sepx_), %eval(&_wcounti_+1), %nrbquote(|)))));
%let _wcounti_=%eval(&_wcounti_+1);
%let _sepxi_=%nrbquote(%qscan(%nrbquote(&_sepx_), &_wcounti_, %nrbquote(|)));
%if (%length(&_sepxi_) ge 2) %then %do;
%let _ispecialchar_=%eval(&_ispecialchar_+1); %let _specialchari_=%substr(&_specialchar_, &_ispecialchar_, 1);
%let _dlmx_=&_dlmx_.&_specialchari_;
%let _strx_=%sysfunc(tranwrd(%nrbquote(&_strx_), %nrbquote(&_sepxi_),%nrbquote(&_specialchari_)));
%end;
%else %let _dlmx_=&_dlmx_.&_sepxi_;
%end;
%scan(%nrbquote(&_strx_), &_cntx_, %quote(&_dlmx_));
%end;
%mend sscan;