--- %%NOBANNER%% -->
/*-------------------<---Start of Description-->---------------------\
| Capitalize the 1st letter of a sentence or the 1st letter of each |
| word in a setence; |
|---------------------<---End of Description-->----------------------|
|--------------------------------------------------------------------|
|------------<---Start of Files or Arguments Needed-->---------------|
| indata: input data set; |
| var: the variable need to be capitalized; |
| outdata: if an outdata is given, then the output the dataset to it;|
| otherwise saved the dataset to the input dataset; |
| dlm: the delimiter to separate word or setence; |
| if dlm=' ' or WORD, capitalize the 1st letter of each word in |
| the variable; |
| if dlm=';', ',' or SENTENCE, capitalize the 1st letter of the |
| sentence; |
| if dlm=any punctuation, capitalize the 1st letter after it; |
|-------------<---End of Files or Arguments Needed-->----------------|
|--------------------------------------------------------------------|
|------------------<---Start of Files Created-->---------------------|
| Example: |
| data one; |
| input x y cpevent $21.; |
| datalines; |
| 1.1 1.2 'OneTwo' |
| 12 132 tHIS is, AN,EXAMPLE |
| 1.1 2.3 1 MONTH FOLLOW-UP |
| 2.1 232 4 MONTH FOLLOW-UP |
| 1.3 4.1 7 MONTH FOLLOW-UP |
| 4.2 100 UNSCHEDULED FOLLOW-UP |
| ; |
| data two; |
| set one; |
| cpevent=lowcase(cpevent); |
| %dvupcase(var=cpevent, |
| dlm=',' ';' '/' '\' '"' "'" '(' ')' ' ' '-', |
| except=('an', 'a')); |
| run; %print(two); |
| Usage: %dvupcase(var=, dlm=' '); |
\-------------------<---End of Files Created-->---------------------*/
%macro dvupcase(var=, dlm=' ', except='')/parmbuff;
/*--------------------------------------------\
| Author: Duo Zhou; |
| Created: 12-27-2001 12:21am; |
| Purpose: Capitalize the 1st letter of a |
| sentence or the 1st letter of each |
| word in a setence; |
\--------------------------------------------*/
%local _dvupi_ _argtmp_;
%if (%index(%BQUOTE(&syspbuff), %str(%()) and %index(%BQUOTE(&syspbuff), %str(%())<2) %then
%let syspbuff=%substr(%quote(%trim(%left(&syspbuff))), 2, %eval(%length(%quote(%trim(%left(&syspbuff))))-2));
%let syspbuff=%sysfunc(translate(%quote(&syspbuff), %str(%'), %str(%")));
%let syspbuff=%sysfunc(tranwrd(%quote(&syspbuff), ',', ÌÎÍ));
%let _dvupi_=0;
%do %while(%length(%nrbquote(%qscan(%nrbquote(&syspbuff), %eval(&_dvupi_+1), %str(,)))));
%let _dvupi_=%eval(&_dvupi_+1);
%let _argtmp_=%qscan(%nrbquote(&syspbuff), &_dvupi_, %str(,));
%let _argtmp_=%sysfunc(tranwrd(%nrbquote(&_argtmp_), ÌÎÍ, ','));
%if (not %index(%BQUOTE(&_argtmp_), %str(=))) %then %do;
%if (%quote(&_dvupi_) eq 1) and (%length(%trim(%quote(%left(%quote(&var))))) le 2) %then %let var=&_argtmp_;
%if (%quote(&_dvupi_) eq 2) and (%length(%trim(%quote(%left(%quote(&dlm))))) le 2) %then %let dlm=&_argtmp_;
%if (%quote(&_dvupi_) eq 3) and (%length(%trim(%quote(%left(%quote(&except))))) le 2) %then %let except=&_argtmp_;
%end;
%end;
length _last1char_ _last2char_ _dvchar_ $1. _NEWCP_ $200;
%if (%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(&except))))), %str(%()) eq 1) and
(%index(%BQUOTE(%trim(%BQUOTE(%left(%BQUOTE(%sysfunc(reverse(&except))))))), %str(%))) eq 1)
%then %let except=%substr(%quote(%trim(%left(&except))), 2, %eval(%length(%quote(%trim(%left(&except))))-2));
%let except=%sysfunc(translate(%quote(&except), %str(%'), %str(%"))); %let _excpti_=0; %let _excptcnt_=0;
&var=trimn(left(compbl(&var)));
%do %while(%length(%nrbquote(%qscan(%nrbquote(&except), %eval(&_excpti_+1), %str(,)))));
%let _excpti_=%eval(&_excpti_+1);
%let _excptmp_=%qscan(%nrbquote(&except), &_excpti_, %str(,));
%if (%quote(%sysfunc(dequote(%quote(&_excptmp_)))) ne) %then %do;
%let _excptmp_=%sysfunc(tranwrd(%nrbquote(&_excptmp_), ÌÎÍ, ','));
%let _excptfr&_excpti_=%sysfunc(dequote(&_excptmp_));
%let _excptto&_excpti_=®%trim(%left(&_excpti_));
&var=tranwrd(compbl(&var), "&&_excptfr&_excpti_", "&&_excptto&_excpti_");
%end;
%else %let _excptfr&_excpti_=;
%end; %let _excptcnt_=&_excpti_;
%if (%quote(&dlm) eq ) %then %let dlm=' ';
_last1char_=' '; _last2char_=' '; _NEWCP_=' ';
_dummyqcp_=trimn(left(compress(&var, '"')));
_dummyqcp_=trimn(left(compress(_dummyqcp_, "'")));
_dummyqn_=length(trimn(left(&var)))-length(trimn(left(_dummyqcp_)));
%if (%length(&dlm)>1) %then %do;
retain _dummyqi_; _dummyqi_=0;
do _dvari_=1 to length(&var);
_dvchar_=substr(&var,_dvari_,1);
if ((_last1char_ in (&dlm)) or (_last1char_=' ' and _last2char_ in (&dlm)) or (_dvari_=1)) then
_dvchar_=upcase(_dvchar_);
else _dvchar_=lowcase(_dvchar_);
if (_last1char_ in (' ', '`', '~', '!', '@','#','$', '%', '^', '&','*','(',')','-','_','+','=','[',']','{','}','|','\',';',':','"',"'",'<','>',',','.','/','?')
or (_last2char_ in (' ', '`', '~', '!', '@','#','$', '%', '^', '&','*','(',')','-','_','+','=','[',']','{','}','|','\',';',':','"',"'",'<','>',',','.','/','?'))
or (_dvchar_ in (' ', '`', '~', '!', '@','#','$', '%', '^', '&','*','(',')','-','_','+','=','[',']','{','}','|','\',';',':','"',"'",'<','>',',','.','/','?'))) then do;
if (_dvchar_ in ('`', '~', '!', '@','#','%', '^', ')','-','_','+','=',']','}','\',';',':','<','>',',','.','/','?')) then
_NEWCP_=trimn(left(_NEWCP_))||_dvchar_;
else if (_dvchar_ in ('$', '&','(','[','{','|')) then
_NEWCP_=compbl(_NEWCP_)||_dvchar_;
else if (_last1char_ in ('!','%', '&',')',']','}',';',':',',','.','?')) then
_NEWCP_=compbl(_NEWCP_)||_dvchar_;
else if (_last1char_=' ' and _last2char_ in ('`','~','@','#','$','^','*','(','[','{','\','<','>','/')) then
_NEWCP_=trimn(left(_NEWCP_))||_dvchar_;
else if (_last2char_ in ('!', '%', '&',')',']','}',';',':',',','.','?') and _last1char_=' ') then
_NEWCP_=compbl(_NEWCP_)||_dvchar_;
else if (_dvchar_ in ('"', "'")) then do;
_dummyqi_=_dummyqi_+1;
if (mod(_dummyqn_, 2)) then _NEWCP_=trimn(left(_NEWCP_))||_dvchar_;
else if (mod(_dummyqi_, 2)) then _NEWCP_=compbl(_NEWCP_)||_dvchar_;
else _NEWCP_=trimn(left(_NEWCP_))||_dvchar_;
/* put '5 ' _dummyqi_= _NEWCP_=; */
end;
else if (_last1char_ ne ' ' and _dvchar_ ne ' ') then _NEWCP_=trimn(left(_NEWCP_))||_dvchar_;
else _NEWCP_=compbl(_NEWCP_)||_dvchar_;
end;
else _NEWCP_=trimn(left(_NEWCP_))||_dvchar_;
_last2char_=_last1char_; _last1char_=_dvchar_;
end;
%end;
%else _NEWCP_=upcase(substr(&var,1,1))||lowcase(substr(&var,2,(length(&var)-1)));;
%if (%quote(&_excptcnt_) ge 1) %then %do;
%do _excpti_=1 %to &_excptcnt_;
%if (%quote(&&_excptfr&_excpti_) ne) %then
_NEWCP_=tranwrd(_NEWCP_, "&&_excptto&_excpti_", "&&_excptfr&_excpti_");;
%end;
%end;
&var=_NEWCP_;
drop _NEWCP_ _dvari_ _dvchar_ _last1char_ _last2char_ _dummyqn_ _dummyqi_ _dummyqcp_;
%mend dvupcase;