You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

369 lines
9.7 KiB
Plaintext

7 months ago
*! lstrfun Version 1.2 dan_blanchette@unc.edu 09Aug2011
*! the carolina population center, unc-ch
* -Nick Cox let me know that the regular expersion functions were available in Stata 9.2
* but were just not documented
* lstrfun Version 1.1 dan_blanchette@unc.edu 22Jul2011
** -it now can run regexr(), regexm() and regexs()
** lstrfun Version 1.0 dan_blanchette@unc.edu 09Aug2010
** Center for Entrepreneurship and Innovation Duke University's Fuqua School of Business
* modify long local macros with mata string functions
program define lstrfun
version 9.2
syntax [namelist(local)] [, lower(string asis) upper(string asis) proper(string asis) ///
ltrim(string asis) itrim(string asis) rtrim(string asis) trim(string asis) ///
substr(string asis) subinstr(string asis) subinword(string asis) ///
reverse(string asis) strdup(string asis) soundex(string asis) soundex_nara(string asis) ///
strlen(string asis) strpos(string asis) _substr(string asis) indexnot(string asis) ///
strmatch(string asis) regexr(string asis) regexm(string asis) regexms(string asis) ///
]
if missing(`"`namelist'"') {
display as error "need to specify a local macro variable name to modify or create"
exit 198
}
local n_locals : word count `namelist'
if `n_locals' > 1 {
display as error "only one local macro variable name can be submitted"
exit 198
}
// local m1= !missing(`"`macval(lower)'"'
// says "too few quotes" when a fairly long macro submitted but only inside a program
// using short macro names and no spaces to make it even shoerter
local m1=`"`macval(lower)'"'!=""
local m2=`"`macval(proper)'"'!=""
local m3=`"`macval(upper)'"'!=""
local m4=`"`macval(ltrim)'"'!=""
local m5=`"`macval(itrim)'"'!=""
local m6=`"`macval(rtrim)'"'!=""
local m7=`"`macval(trim)'"'!=""
local m8=`"`macval(substr)'"'!=""
local m9=`"`macval(subinstr)'"'!=""
local m10=`"`macval(subinword)'"'!=""
local m11=`"`macval(strdup)'"'!=""
local m12=`"`macval(reverse)'"'!=""
local m13=`"`macval(soundex)'"'!=""
local m14=`"`macval(soundex_nara)'"'!=""
local m15=`"`macval(strlen)'"'!=""
local m16=`"`macval(strpos)'"'!=""
local m17=`"`macval(_substr)'"'!=""
local m18=`"`macval(indexnot)'"'!=""
local m19=`"`macval(strmatch)'"'!=""
local m20=`"`macval(regexr)'"'!=""
local m21=`"`macval(regexm)'"'!=""
local m22=`"`macval(regexms)'"'!=""
if `m1' ///
+ `m2' ///
+ `m3' ///
+ `m4' ///
+ `m5' ///
+ `m6' ///
+ `m7' ///
+ `m8' ///
+ `m9' ///
+ `m10' ///
+ `m11' ///
+ `m12' ///
+ `m13' ///
+ `m14' ///
+ `m15' ///
+ `m16' ///
+ `m17' ///
+ `m18' ///
+ `m19' ///
+ `m20' ///
+ `m21' > 1 {
display as error "you can only specify 1 option in {helpb lstrfun:lstrfun}"
exit 198
}
if `m1' == 1 {
mata: long_lower(`macval(lower)')
c_local `namelist' `"`macval(lower)'"'
}
else if `m2' == 1 {
mata: long_proper(`macval(proper)')
c_local `namelist' `"`macval(proper)'"'
}
else if `m3' == 1 {
mata: long_upper(`macval(upper)')
c_local `namelist' `"`macval(upper)'"'
}
else if `m4' == 1 {
mata: long_ltrim(`macval(ltrim)')
c_local `namelist' `"`macval(ltrim)'"'
}
else if `m5' == 1 {
mata: long_itrim(`macval(itrim)')
c_local `namelist' `"`macval(itrim)'"'
}
else if `m6' == 1 {
mata: long_rtrim(`macval(rtrim)')
c_local `namelist' `"`macval(rtrim)'"'
}
else if `m7' == 1 {
mata: long_trim(`macval(trim)')
c_local `namelist' `"`macval(trim)'"'
}
else if `m8' == 1 {
mata: long_substr(`macval(substr)')
c_local `namelist' `"`macval(substr)'"'
}
else if `m9' == 1 {
mata: long_subinstr(`macval(subinstr)')
c_local `namelist' `"`macval(subinstr)'"'
}
else if `m10' == 1 {
mata: long_subinword(`macval(subinword)')
c_local `namelist' `"`macval(subinword)'"'
}
else if `m11' == 1 {
mata: long_strdup(`macval(strdup)')
local len_strdup : length local strdup
if `len_strdup' < `len_m_var' {
local clen_m_var= string(`len_m_var',"%11.0gc")
if c(SE) & c(maxvar) < 32767 & `len_m_var' <= 1081511 {
display as error "{cmd:strdup()} generated a string that has `clen_m_var' characters which is more than Stata can handle" ///
" when {helpb maxvar:maxvar} is set to `c(maxvar)'."
display as error "Increase your {helpb maxvar:maxvar} setting higher and try again."
exit 149
}
else {
display as error "{cmd:strdup()} generated a string that has `clen_m_var' characters (which is more than Stata can handle)"
exit 149
}
}
c_local `namelist' `"`macval(strdup)'"'
}
else if `m12' == 1 {
mata: long_reverse(`macval(reverse)')
c_local `namelist' `"`macval(reverse)'"'
}
else if `m13' == 1 {
mata: long_soundex(`macval(soundex)')
c_local `namelist' `"`macval(soundex)'"'
}
else if `m14' == 1 {
mata: long_soundex_nara(`macval(soundex_nara)')
c_local `namelist' `"`macval(soundex_nara)'"'
}
else if `m15' == 1 {
mata: long_strlen(`macval(strlen)')
c_local `namelist' `"`macval(strlen)'"'
}
else if `m16' == 1 {
mata: long_strpos(`macval(strpos)')
c_local `namelist' `"`macval(strpos)'"'
}
else if `m17' == 1 {
mata: long__substr(`macval(_substr)')
c_local `namelist' `"`macval(_substr)'"'
}
else if `m18' == 1 {
mata: long_indexnot(`macval(indexnot)')
c_local `namelist' `"`macval(indexnot)'"'
}
else if `m19' == 1 {
mata: long_strmatch(`macval(strmatch)')
c_local `namelist' `"`macval(strmatch)'"'
}
else if `m20' == 1 {
mata: long_regexr(`macval(regexr)')
c_local `namelist' `"`macval(regexr)'"'
}
else if `m21' == 1 {
mata: long_regexm(`macval(regexm)')
c_local `namelist' `"`macval(regexm)'"'
}
else if `m22' == 1 {
mata: long_regexms(`macval(regexms)')
c_local `namelist' `"`macval(regexms)'"'
}
else {
display as error "need to specify an option in {helpb lstrfun:lstrfun}"
exit 198
}
end
mata:
void long_lower(string scalar lstring)
{
string scalar m_var
m_var= strlower(lstring)
st_local("lower",m_var)
}
void long_proper(string scalar lstring)
{
string scalar m_var
m_var= strproper(lstring)
st_local("proper",m_var)
}
void long_upper(string scalar lstring)
{
string scalar m_var
m_var= strupper(lstring)
st_local("upper",m_var)
}
void long_ltrim(string scalar lstring)
{
string scalar m_var
m_var= strltrim(lstring)
st_local("ltrim",m_var)
}
void long_itrim(string scalar lstring)
{
string scalar m_var
m_var= stritrim(lstring)
st_local("itrim",m_var)
}
void long_rtrim(string scalar lstring)
{
string scalar m_var
m_var= strrtrim(lstring)
st_local("rtrim",m_var)
}
void long_trim(string scalar lstring)
{
string scalar m_var
m_var= strtrim(lstring)
st_local("trim",m_var)
}
void long_substr(string scalar lstring, real scalar start, real scalar length)
{
string scalar m_var
m_var= substr(lstring,start,length)
st_local("substr",m_var)
}
void long_subinstr(string scalar lstring, string scalar old, string scalar snew, real scalar cnt)
{
string scalar m_var
m_var= subinstr(lstring,old,snew,cnt)
st_local("subinstr",m_var)
}
void long_subinword(string scalar lstring, string scalar old, string scalar snew, real scalar cnt)
{
string scalar m_var
m_var= subinword(lstring,old,snew,cnt)
st_local("subinword",m_var)
}
void long_strdup(string scalar lstring, real scalar n)
{
string scalar m_var
m_var= n*lstring
real scalar len_lstring
len_lstring= n * strlen(lstring)
real scalar len_m_var
len_m_var= strlen(m_var)
string scalar slen_m_var
slen_m_var= strofreal(len_m_var)
st_local("len_m_var",slen_m_var)
st_local("strdup",m_var)
}
void long_reverse(string scalar lstring)
{
string scalar m_var
m_var= strreverse(lstring)
st_local("reverse",m_var)
}
void long_soundex(string scalar lstring)
{
string scalar m_var
m_var= soundex(lstring)
st_local("soundex",m_var)
}
void long_soundex_nara(string scalar lstring)
{
string scalar m_var
m_var= soundex_nara(lstring)
st_local("soundex_nara",m_var)
}
void long_strlen(string scalar lstring)
{
string scalar m_var
real scalar nm_var
nm_var= strlen(lstring)
m_var= strofreal(nm_var)
st_local("strlen",m_var)
}
void long_strpos(string scalar lstring, string scalar needle)
{
string scalar m_var
real scalar nm_var
nm_var= strpos(lstring,needle)
m_var= strofreal(nm_var)
st_local("strpos",m_var)
}
void long__substr(string scalar lstring, string scalar tosub, real scalar pos)
{
_substr(lstring, tosub, pos)
st_local("_substr",lstring)
}
void long_indexnot(string scalar lstring, string scalar needle)
{
string scalar m_var
real scalar nm_var
nm_var= indexnot(lstring,needle)
m_var= strofreal(nm_var)
st_local("indexnot",m_var)
}
void long_strmatch(string scalar lstring, string scalar pattern)
{
string scalar m_var
real scalar nm_var
nm_var= strmatch(lstring,pattern)
m_var= strofreal(nm_var)
st_local("strmatch",m_var)
}
void long_regexr(string scalar lstring, string scalar pattern, string scalar rep)
{
string scalar m_var
m_var= regexr(lstring,pattern,rep)
st_local("regexr",m_var)
}
void long_regexm(string scalar lstring, string scalar pattern)
{
string scalar m_var
real scalar nm_var
nm_var= regexm(lstring,pattern)
m_var= strofreal(nm_var)
st_local("regexm",m_var)
}
void long_regexms(string scalar lstring, string scalar pattern, real scalar ss)
{
string scalar m_var
if (regexm(lstring,pattern)) {
m_var= regexs(ss)
}
st_local("regexms",m_var)
}
end