*! version 1.0.4 05nov2009 logout by roywada@hotmail.com *! Converts log or ASCII files into various output formats program define logout local _original `0' versionSet version `version' /* "using" no longer used * encase the colon in file name in quotes, avoiding string function length limits local behind `"`0'"' local 0 "" gettoken front behind: behind, parse(" ,") local 0 "" local done 0 while `"`front'"'~="" & `done'==0 { if `"`front'"'=="using" { gettoken rest behind: behind, parse(" ,") * strip off quotes gettoken first second: rest, parse(" ") cap local rest: list clean local(rest) * take off colon at the end local goldfish "" if index(`"`rest'"',":")~=0 { local end=substr(`"`rest'"',length(`"`rest'"'),length(`"`rest'"')) if "`end'"==":" { local rest=substr(`"`rest'"',1,`=length(`"`rest'"')-1') local goldfish " : " } } * colon reattached with a space at the end * .txt attached here for seeout working with _pref.ado local rabbit `"""' if index(`"`rest'"', ".")==0 { local using `"`rabbit'`rest'.txt`rabbit'`goldfish'"' } else { local using `"`rabbit'`rest'`rabbit'`goldfish'"' } local 0 `"`0' using `using' `behind'"' local done 1 } else { local 0 `"`0' `front'"' gettoken front behind: behind, parse(" ,") } } */ gettoken first second : 0, parse(":") `bind' match(par) quotes local 0 `"`first'"' while `"`first'"'~=":" & `"`first'"'~="" { gettoken first second : second, parse(":") `bind' match(par) quotes } if `"`0'"'==":" { * colon only when shorthand combined with prefix local 0 } else { * not used local _0 `"`0'"' } *** shorthand syntax if use file is missing syntax[, use(string) save(string) FIX1(numlist) clear FIX fixcut(numlist) text smcl* range(string asis)] if "`fixcut'"~="" { local fix fix } if "`clear'"~="clear" { preserve } if "`fix1'"~="" { local fix "fix" } if "`Version7'"=="" & "`fix'"=="" { * must be fix local fix fix noi di in yellow "fix option inserted" } * regular stuff if `"`use'"'~="" { * with use file * `second' could contain " " only ??? gettoken a b : second, parse(" ") if `"`a'"'~="" { noi di in red "cannot combine {opt use( )} with command statements at end; use one or the other" exit 198 } if "`fix1'"=="" { local fix1 5 } *`second' if `"`range'"'~="" { tempfile capfile2 gettoken one two: range, parse("/") gettoken splash two: two, parse("/") _chewfile using `"`use'"', save(`capfile2') replace begin(`one') end(`two') _logout, use(`"`capfile2'"') save(`"`save'"') `options' fix1(`fix1') `clear' `fix' fixcut(`fixcut') original(`_original') range(`range') } else { _logout, use(`"`use'"') save(`"`save'"') `options' fix1(`fix1') `clear' `fix' fixcut(`fixcut') original(`_original') range(`range') } } else { * with temporary file tempfile capfile local tempfile tempfile if "`Version7'"=="" { * a permanent file name for version 7 local capfile "logout.txt" } * `second' could contain " " only gettoken a b : second, parse(" ") if `"`a'"'~="" { cap unabcmd `a' if _rc==0 { * it's a command if (`"`r(cmd)'"'=="table" | `"`r(cmd)'"'=="tabstat") & "`fix1'"=="" { local fix1 1 } } if "`fix1'"=="" { local fix1 5 } noi caplog using `"`capfile'"', tempfile replace `text' `smcl' subspace: `second' if `"`range'"'~="" { tempfile capfile2 gettoken one two: range, parse("/") gettoken splash two: two, parse("/") _chewfile using `"`capfile'"', save(`capfile2') replace begin(`one') end(`two') _logout, use(`"`capfile2'"') save(`"`save'"') `options' fix1(`fix1') tempfile `clear' `fix' fixcut(`fixcut') original(`_original') range(`range') } else { _logout, use(`"`capfile'"') save(`"`save'"') `options' fix1(`fix1') tempfile `clear' `fix' fixcut(`fixcut') original(`_original') range(`range') } } else { if "`fix1'"=="" { local fix1 5 } * range needs to be activated here for dataout functionality _logout, save(`"`save'"') `options' fix1(`fix1') `clear' `fix' fixcut(`fixcut') original(`_original') range(`range') } } end ******************************************************************************************** program define _logout versionSet version `version' *syntax [using/] , [save(string) nounwrap excel word tex col row ignore(string) drop(string) clear dta ] syntax, [ save(string) use(string) nounwrap NOWIPE excel dta tex word clear /* */ NOAUTO raw right FIX FIX1(numlist >=-100 <=100 max=1) replace tempfile /* */ auto(integer 3) dec(numlist int >=0 <=11) fixcut(numlist) range(str asis)] original(str asis) * note: options original and range are not really used here: qui { local colsizeMax 1 if `"`save'"'~="" { * assign save name local beg_dot = index(`"`save'"',".") if `beg_dot'~=0 { local strippedname = substr(`"`save'"',1,`=`beg_dot'-1') local save `"`strippedname'.txt"' } else { * `save' has no extension local strippedname `"`save'"' local save `"`save'.txt"' } cap confirm file `"`save'"' if !_rc & "`replace'"~="replace" { * it exists noi di in red `"`save' exists; specify {opt replace}"' exit 198 } } else { tempfile tempsave local save `"`tempsave'"' } if "`use'"~="" { if "`tempfile'"~="tempfile" { local beg_dot = index(`"`use'"',".") if `beg_dot'~=0 { local strippedname1 = substr(`"`use'"',1,`=`beg_dot'-1') * no need to reassign name *local use `"`strippedname1'.txt"' } else { * `use' has no extension local strippedname1 `"`use'"' local use `"`use'.txt"' } } if "`drop'"~="" { if "`unwrap'"=="nounwrap" { noi di in red "Cannot combine {opt nounwrap} and {opt drop( )}" exit 198 } else { local unwrap "unwrap" } } clear cap file close _all *local 0 `"using `0'"' tempname source saving if "`unwrap'"~="nounwrap" { *** wrapping text problem ONLY local linenum = 0 file open `source' using `"`use'"', read file open `saving' using `"`save'"', write text replace file read `source' line * first line if r(eof)==0 { local linenum = `linenum' + 1 local last_macvalline `"`macval(line)'"' file read `source' line } * subsequent lines local _n while r(eof)==0 { local linenum = `linenum' + 1 cap tokenize `"`macval(last_macvalline)'"', parse(" []:") * handle the grave accent thing if _rc~=0 { noi di in yel `"line `linenum' contains a grave accent (or something), attempt was made to convert it into "grave_accent""' local last_macvalline : subinstr local last_macvalline "`" "grave_accent", all gettoken 1 2 : last_macvalline, parse(" []:") } if `"`1'"'==">" { * remove the first instance of ">" local last_macvalline : subinstr local last_macvalline "> " "" file write `saving' `"`macval(last_macvalline)'"' } else { file write `saving' `_n' cap file write `saving' `"`macval(last_macvalline)'"' if _rc~=0 { noi di in yel `"line `linenum' was unable to be written, left blank"' file write `saving' "" } } local _n "_n" local last_macvalline `"`macval(line)'"' file read `source' line } * the last line local linenum = `linenum' + 1 cap tokenize `"`macval(last_macvalline)'"', parse(" []:") * handle the grave accent thing if _rc~=0 { noi di in yel `"line `linenum' contains a grave accent (or something), attempt was made to convert it into "grave_accent""' local last_macvalline : subinstr local last_macvalline "`" "grave_accent", all gettoken 1 2 : last_macvalline, parse(" []:") } if `"`1'"'==">" { * remove the first instance of ">" local last_macvalline : subinstr local last_macvalline ">" "" file write `saving' `"`macval(last_macvalline)'"' } else { file write `saving' `_n' cap file write `saving' `"`macval(last_macvalline)'"' if _rc~=0 { noi di in yel `"line `linenum' was unable to be written, left blank"' file write `saving' "" } } local _n "_n" * close out with the last line file write `saving' _n file close `source' file close `saving' } if "`unwrap'"~="nounwrap" { file open `source' using `"`save'"', read } else { file open `source' using `"`use'"', read } if "`fix'"=="fix" { *** fix files _logfix, use(`use') fix1(`fix1') fixcut(`fixcut') } else { *** delimited files local col_size 98 local linenum = 1 file read `source' line local OBS 50 set obs `OBS' if "`raw'"=="raw" { gen str7 raw="" replace raw=`"`line'"' in 1 local _format= "`: format raw'" local _widths=substr("`_format'",2,length(trim("`_format'"))-2) format raw %-`_widths's } gen rowLine=. gen tokenMax=. * this adjusted forval num=1/`colsizeMax' { gen str2 t`num'="" } while r(eof)==0 { if `linenum'>`OBS'-1 { local OBS=`OBS'+50 cap set obs `OBS' if _rc==198 { noi di in red "Cannot increase observation number beyond `OBS': probably need more memory" } } *display %4.0f `linenum' _asis `" `macval(line)'"' local checking=substr(trim(`"`macval(line)'"'),1,5) *noi di `"`checking'"' if `"`checking'"'=="-----" { replace rowLine=`linenum' in `linenum' replace t1=`"`checking'"' in `linenum' } else { local macvalline `"`macval(line)'"' local macvalline : subinstr local macvalline "Prob > chi2" "Prob>chi2", all local macvalline : subinstr local macvalline "Number of groups" "Number_of_groups", all local macvalline : subinstr local macvalline "Obs per group: min" "Obs_per_group_min", all local macvalline : subinstr local macvalline "Number of obs" "Number_of_obs", all local macvalline : subinstr local macvalline "Root MSE" "Root_MSE", all local macvalline : subinstr local macvalline "Prob > F" "Prob>F", all local macvalline : subinstr local macvalline "Std. Err." "Std.Err.", all local macvalline : subinstr local macvalline "Std. Dev." "Std.Dev.", all local macvalline : subinstr local macvalline "95% Conf." "95%_Conf.", all local macvalline : subinstr local macvalline "Sum of Wgt." "Sum_of_Wgt.", all local macvalline : subinstr local macvalline "log pseudolikelihood" "log_pseudolikelihood", all cap tokenize `"`macvalline'"', parse(" []:`=char(9)'") * handle the grave accent thing if _rc~=0 { noi di in yel `"line `linenum' contains a grave accent (or something), attempt was made to convert it into "grave_accent""' local macvalline : subinstr local macvalline "`" "grave_accent", all tokenize `"`macvalline'"', parse(" []:`=char(9)'") } * numToken is the token number * numCol is the column number local numToken=1 local numCol=1 local stop "" replace rowLine=`linenum' in `linenum' while `"``numToken''"'~="" & "`stop'"~="stop" { if `"``numToken''"'~="[" & /* */ `"``numToken''"'~="]" & /* */ `"``numToken''"'~=":" & /* */ `"``numToken''"'~="|" & /* */ `"``numToken''"'~="`=char(9)'" { * add more columns if necessary if `numToken'>=`colsizeMax' { local colsizeMax=`colsizeMax'+1 gen str2 t`colsizeMax'="" if "`c(flavor)'"=="small" & `colsizeMax'>=`col_size' { noi di in yel `"Stata flavor "small", unable to have more than 99 columns"' local stop stop } } *noi di in red `"``numToken''"' _c *noi di in green "" replace t`numCol'=`"``numToken''"' in `linenum' /* * auto-digits local check = `"``numToken''"' capture confirm number `check' *noi di in green "`=_rc'" if _rc==0 & "`noauto'"~="noauto" { * only if a number autodigits2 `"``numToken''"' `auto' local valstr = string(`check',"%12.`r(valstr)'") *noi di in yel `"`valstr'"' /* prevent adding non-signnificant 0 at the end ****** does NOT handle scientific notations, or does it? local beg_dot1 = index(`"``numToken''"',".") local stripped1 = substr(`"``numToken''"',`=`beg_dot1'+1',.) local length1 : length local stripped1 local beg_dot2 = index(`"`valstr'"',".") local stripped2 = substr(`"`valstr'"',`=`beg_dot2'+1',.) local length2 : length local stripped2 if `length2'<=`length1' & `length2'~=0 & `beg_dot2'~=0 & `length1'>0 { replace t`numCol'=`"`valstr'"' in `linenum' } else { replace t`numCol'=`"``numToken''"' in `linenum' } */ replace t`numCol'=`"`valstr'"' in `linenum' } else { * only if not a number replace t`numCol'=`"``numToken''"' in `linenum' } */ replace tokenMax=`numCol' in `linenum' local numCol=`numCol'+1 } local numToken=`numToken'+1 } } file read `source' line * noi di `"`macval(line)' dd `r(eof)'"' local linenum = `linenum' + 1 if "`raw'"=="raw" { replace raw=`"`macval(line)'"' in `linenum' } } /* works with pre-tokenized columns, but not used because tokenize better if already unwrapped as above, * mostly due to the handling of rabbit-ears poking out * wrapping text problem if "`unwrap'"~="nounwrap" { * skip first line forval num=`=_N'(-1)2 { if token1==">" in `num' { * counter keeps track of which column being moved to the right end of the previous row * token1 is skipped since it has < forval counter=2/`=tokenMax[`num']' { replace t`=tokenMax[`num'-1]+`=`counter'-1''=t`counter'[`num'] in `=`num'-1' } replace tokenMax=tokenMax[`num'-1]+tokenMax[`num'] in `=`num'-1' } } } */ /* this is slow local num `colsizeMax' local stop "" while `num' > 1 & "`stop'"=="" { count if t`num'=="" if r(N)==_N { drop t`num' } else { local stop "stop" } local num=`num'-1 } */ * clean up if "`row'"~="row" { drop rowLine } if "`col'"~="col" { drop tokenMax } * drop extra columns indiscriminately * this is slow foreach var of varlist _all { count if `var'=="" if r(N)==_N { drop `var' } } * drop from top gen rowmiss=0 foreach var of varlist _all { * cap because rowmiss is non-string cap replace rowmiss=rowmiss+1 if `var'~="" & "`var'"~="rowmiss" } local N=_N local oldN while "`N'"~="`oldN'" { local oldN=_N drop in 1 if rowmiss==0 local N=_N } * drop from bottom local N=_N local oldN while "`N'"~="`oldN'" { local oldN=_N drop in `oldN' if rowmiss==0 local N=_N } drop rowmiss file close `source' file close _all } /*** delimited files */ } /* if "`using'"~="" */ if "`nowipe'"~="nowipe" & "`fix'"~="fix" { cap drop if t1=="-----" | t1=="opened" | t1=="log" | t1=="." | t1=="closed" } /* workaround to see if heading should be reported local noheading 0 local test 0 foreach var of varlist local temp=instr("`var'",1,2) capture confirm string `temp' if _rc==0 { local * only if a string local test 1 } } local temp=instr("`var'",2,3) capture confirm number `temp' if _rc==0 & "`test'"=="1" { * only if a number local noheading=`noheading'+1 } } } */ * replace the gap holders for value labels * heading for _dataout if "`use'"~="" | "`clear'"=="clear" { * not being used as dataout local head "head" foreach var of varlist _all { replace `var'= subinstr(`var',"_"," ",.) local heading "nohead" } else { *local heading "head" * make it always nohead local heading "nohead" } } local heading "nohead" } /* quietly */ * display the fix command if "`fixcutCollect'"~="" { *di in yel `" logcut`original' fixcut(`fixcutCollect')"' gettoken one two: fixcutCollect, parse(" ") di in yel `" fixcut(`one'`two')"' } * display unless temp file was used or not given at all (used the current file in memory) if "`tempfile'"~="tempfile" & `"`usingTerm'"'~="" { local usingTerm `"`use'"' local cl_text `"{browse `"`usingTerm'"'}"' noi di as txt `"`cl_text'"' } * export files local doit local doit "`doit'`excel'" local doit "`doit'`word'" local doit "`doit'`tex'" local doit "`doit'`dta'" if `"`doit'"'~="" { di * add one row if 2 or less local N=_N if `N'<3 { qui { tempvar order if `N'==0 { set obs 3 } else { * `N'==1 | `N'==2 gen `order'=_n set obs 3 local N=_N replace `order'=0 in `N' sort `order' drop `order' } } } if "`dec'"~="" { local noauto "noauto" } if "`save'"=="" { noi di in red "must specify {opt save( )}" exit 198 } * workaround for names ds8 local names `"`r(varlist)'"' local strippednameUse `"`strippedname'"' if `"`strippedname'"'=="" { local strippednameUse `"`strippedname1'"' } _dataout, save(`"`strippednameUse'"') `excel' `tex' `word' `dta' `replace' `heading' `noauto' auto(`auto') dec(`dec') * folder _cdout local num 1 foreach var of varlist _all { local temp: word `num' of `names' ren `var' `temp' local num=`num'+1 } } /* file open `saving' using `save', write text replace forval linenum=1/`=_N' { local content=raw[`linenum'] file write `saving' `"`macval(content)'"' _n local linenum = `linenum' + 1 } file close _all */ end ******************************************************************************************** program define _logfix versionSet version `version' qui { syntax, use(string) FIX1(numlist) [fixcut(numlist)] *** determine the widths of file local infix forval num=1/45 { local infix "`infix' str1 t`num' `num'-`num'" } infix `infix' using `"`use'"', clear local col_size 45 * checking the end of file: count if t41~="" local rN41 `r(N)' count if t42~="" local rN42 `r(N)' count if t43~="" local rN43 `r(N)' count if t44~="" local rN44 `r(N)' count if t45~="" local rN45 `r(N)' local count=`rN41'+`rN42'+`rN43'+`rN44'+`rN45' if `count'~=0 { * do over local infix forval num=1/495 { local infix "`infix' str1 t`num' `num'-`num'" } infix `infix' using `"`use'"', clear local col_size 495 } *drop if t1=="-" & t2=="-" & t3=="-" & t4=="-" & t5=="-" _infix, use(`use') fix1(`fix1') col_size(`col_size') fixcut(`fixcut') /* example gen indicate=1 if rowmiss==0 replace indicate=sum(indicate) *logout, save(mystuff1) excel fix(10) replace noauto: reg price mpg rep78 head *logout, save(mystuff2) excel nowipe replace noauto: reg price mpg rep78 head _infix in 8/`=_N', use(`use') fix1(10) col_size(`col_size') fixcut(`fixcut') gen wave=2 save fixing, replace _infix in 1/7, use(`use') fix1(19) col_size(`col_size') fixcut(`fixcut') append using fixing replace wave=1 if wave==. aorder t* browse logleft, wave_top(1) wave_bot(2) browse */ cap drop rowmiss cap drop indicate } * return c_local fixcutCollect `"`fixcutCollect'"' end /* logfix */ ******************************************************************************************** program define logleft syntax, wave_top(numlist) wave_bot(numlist) unab varList: t* tokenize `varList' local varCount: word count varList local var1 1 local var2 2 while "``var2''"~="" { count if ``var1''~="" & wave==`wave_top' local rN1_top=r(N) count if ``var1''~="" & wave==`wave_bot' local rN1_bot=r(N) count if ``var2''~="" & wave==`wave_top' local rN2_top=r(N) count if ``var2''~="" & wave==`wave_bot' local rN2_bot=r(N) if `rN1_top'~=0 & `rN1_bot'==0 & `rN2_top'==0 & `rN2_bot'~=0 { replace ``var1''=``var2'' if wave==`wave_bot' drop ``var2'' local var1=`var1'+1 local var2=`var2'+1 } else if `rN1_top'==0 & `rN1_bot'~=0 & `rN2_top'~=0 & `rN2_bot'==0 { replace ``var1''=``var2'' if wave==`wave_top' drop ``var2'' local var1=`var1'+1 local var2=`var2'+1 } else if `rN1_top'==0 & `rN1_bot'==0 { drop ``var1'' } local var1=`var1'+1 local var2=`var2'+1 } end ******************************************************************************************** program define _infix versionSet version `version' qui { syntax [in], use(string) FIX1(numlist) col_size(numlist) [fixcut(numlist)] local infix forval num=1/`col_size' { local infix "`infix' str1 t`num' `num'-`num'" } infix `infix' `in' using `"`use'"', clear * must be beyond square local N=_N if `N'<`col_size' { local new_size=`col_size'+5 set obs `new_size' } * replace the lines ds8 tokenize `dsVarlist' local num 0 local one=1+`num' local two=2+`num' local three=3+`num' * 165, 127, 216 while "``three''"~="" { replace ``one''="¥Ø" if ``one''=="-" & ``two''=="-" & ``three''=="-" replace ``two''="¥Ø" if ``one''=="¥Ø" & ``two''=="-" & ``three''=="-" replace ``three''="¥Ø" if ``one''=="¥Ø" & ``two''=="¥Ø" & ``three''=="-" replace ``three''="¥Ø" if ``one''=="¥Ø" & ``two''=="¥Ø" & ``three''=="+" local num=`num'+1 local one=1+`num' local two=2+`num' local three=3+`num' } ds8 local thisMany: word count `dsVarlist' gen height=. forval num=1/`col_size' { qui count if t`num'~="" & t`num'~="¥Ø" di "`r(N)' " _c replace height=`r(N)' in `num' } /* gen id=_n if _n<=100 line height id sort height drop id gen id=_n if _n<=100 line height id */ sum height, det forval wave=1/50 { * limit local times=`fix1'/1000*`wave' local parameter=`r(max)'*`times' gen trend`wave'=. replace trend`wave'=-1 if (height=height[_n+1]==1 replace minima`wave'=1 if minima`wave'[_n-1]==0 & minima`wave'==. } } egen minima=rsum(minima*) order minima* *tab minima /* local infix local begin 1 forval num=1/`thisMany' { local content=minima[`num'] if `content'>25 { local width=`num'-`begin'+1 local infix "`infix' str`width' t`num' `begin'-`num'" local begin=`num'+1 } } * noi di "`infix'" infix `infix' `in' using `"`use'"', clear */ local infix local fixcutCollect local begin 1 * automatically infix forval num=1/`thisMany' { local content=minima[`num'] if `content'>25 { local width=`num'-`begin'+1 local infix "`infix' str`width' t`num' `begin'-`num'" local fixcutCollect "`fixcutCollect' `num'" local begin=`num'+1 } } *noi di in red "`infix'" *noi di in red "`fixcutCollect'" infix `infix' `in' using `"`use'"', clear if "`fixcut'"~="" { local infix local fixcutCollect local begin 1 * manually infix local num 1 tokenize `fixcut' while "``num''"~="" { local width=``num''-`begin'+1 local infix "`infix' str`width' t``num'' `begin'-``num''" local fixcutCollect "`fixcutCollect' ``num''" local begin=``num''+1 local num=`num'+1 } *noi di in red "`infix'" *noi di in red "`fixcutCollect'" infix `infix' `in' using `"`use'"', clear local fixcut fixcutCollect } * drop verticals first local N=_N foreach var of varlist _all { count if `var'=="|" if `r(N)'>.5*`N' { drop `var' } } * stronger codes for manual infix as well * replace the horizontal lines tempvar length test cap gen `length'=. cap gen `test'=. foreach var of varlist _all { cap replace `length'=length(`var') cap replace `test'=(`length'-length(subinstr(`var',"-","",.)))/`length' if `length'>2 cap replace `var'="" if `test'>=0.5 } drop `length' `test' /* older * replace the horizontal lines tempvar length test cap gen `length'=. cap gen str7 `test'="" foreach var of varlist _all { cap replace `length'=length(`var') cap replace `test'=subinstr(`var',"-","",.) if `length'>2 cap replace `var'="" if `test'=="" } drop `length' `test' */ /* oldest replace the horizontal lines foreach var of varlist _all { local N=_N forval num=1/`N' { local content=`var'[`num'] local length=length(`"`content'"') if `length'>2 { local test : subinstr local content "-" "", all if "`test'"=="" { replace `var'="" in `num' } } } } */ compress } /* quietly */ ************ needs to cut at left if not rising anymore * drop extra columns indiscriminately * this is slow foreach var of varlist _all { count if `var'=="" if r(N)==_N { drop `var' } } * drop from top gen rowmiss=0 foreach var of varlist _all { * cap because rowmiss is non-string cap replace rowmiss=rowmiss+1 if `var'~="" & "`var'"~="rowmiss" } local N=_N local oldN while "`N'"~="`oldN'" { local oldN=_N drop in 1 if rowmiss==0 local N=_N } * drop from bottom local N=_N local oldN while "`N'"~="`oldN'" { local oldN=_N drop in `oldN' if rowmiss==0 local N=_N } * return c_local fixcutCollect `"`fixcutCollect'"' end /* _infix */ ******************************************************************************************** *** ripped from dataout Apr 2008 program define _dataout syntax [using/], [save(string) excel tex word dta NOHEAD HEAD replace NOAUTO auto(integer 3) dec(numlist int >=0 <=11)] version 7 if "`fix1'"~="" { local fix "fix" } if `"`using'"'=="" & "`save'"=="" { noi di in red "must specify {opt using} or {opt save( )}" exit 198 } if "`using'"~="" { * attach .txt if nothing attached local beg_dot = index(`"`using'"',".") if `beg_dot'==0 { local using `"`using'.txt"' } } if "`save'"=="" { * assign save name local beg_dot = index(`"`using'"',".") local strippedname = substr(`"`using'"',1,`=`beg_dot'-1') local save "`strippedname'_logout.txt" } else { * assign save name local beg_dot = index(`"`save'"',".") if `beg_dot'~=0 { local strippedname = substr(`"`save'"',1,`=`beg_dot'-1') local save `"`strippedname'.txt"' } else { * `save' has no extension local strippedname `"`save'"' local save `"`save'.txt"' } if `"`using'"'=="" { * if using file was not specified but save was: local beg_dot = index(`"`save'"',".") if `beg_dot'~=0 { local strippedname = substr(`"`save'"',1,`=`beg_dot'-1') } else { local strippedname `"`save'"' } } } qui { if `"`using'"'~="" { preserve qui insheet using `"`using'"', noname clear } *foreach var of varlist _all { * tostring `var', replace force *} stringMaker if "`dec'"~="" { * apply decimals foreach var of varlist _all { local N=_N forval num=1/`N' { local content=`var'[`num'] capture confirm number `content' if _rc==0 { * only if a number replace `var' = string(`content',"%12.`dec'fc") in `num' } else { * only if not a number *replace `var'=`"`content'"' in `num' } } } } if "`noauto'"~="noauto" & "`dec'"=="" { * apply autodigits foreach var of varlist _all { local N=_N forval num=1/`N' { local content=`var'[`num'] capture confirm number `content' if _rc==0 { * only if a number autodigits2 `content' `auto' `less' replace `var' = string(`content',"%12.`r(valstr)'") in `num' } else { * only if not a number *replace `var'=`"`content'"' in `num' } } } } if ("`nohead'"~="nohead" & `"`using'"'=="") | "`head'"=="head" { * moves the variable names down local N=_N+1 tempvar id gen `id'=_n set obs `N' replace `id'=0 in `N' sort `id' drop `id' local num 1 foreach var of varlist _all { replace `var'="`var'" in 1 } } * needs to be renamed regardless local num 1 foreach var of varlist _all { ren `var' v`num' local num=`num'+1 } *** dta file thing if "`dta'"=="dta" { cap confirm file `"`strippedname'.dta"' if !_rc & "`replace'"~="replace" { * it exists noi di in red `"`strippedname'.dta exists; specify {opt replace}"' exit 198 } save `"`strippedname'"', replace *local usingTerm `"`strippedname'.dta"' *local cl `"{browse logout, seefile(`"`usingTerm'"'):`usingTerm'}"' *noi di as txt `"`cl'"' } *** Excel xml file thing if "`excel'"=="excel" { tempfile file1 cap confirm file `"`strippedname'.xml"' if !_rc & "`replace'"~="replace" { * it exists noi di in red `"`strippedname'.xml exists; specify {opt replace}"' exit 198 } save `file1', replace if "`raw'"=="raw" { replace raw=`"""' + raw + `"""' } local titleWide 0 local headBorder 1 local N=_N local bottomBorder `N' *use `outing',clear * _xmlout using `"`strippedname'"', excelFile(`excelFile') nonames titleWide(`titleWide') /* * */ headBorder(`headBorder') bottomBorder(`bottomBorder') local N=_N _xmlout using `"`strippedname'"', nonames headBorder(1) bottomBorder(`N') local usingTerm `"`strippedname'.xml"' local cl `"{browse `"`usingTerm'"'}"' noi di as txt `"`cl'"' use `file1', clear } if "`word'"=="word" | "`tex'"=="tex" { cap preserve if ("`nohead'"=="nohead" & `"`using'"'~="") & "`head'"~="head" { * `using' indicates * files not yet named v* local num 1 foreach var of varlist _all { ren `var' v`num' local num=`num'+1 } } *** Word rtf file thing if "`word'"=="word" { cap confirm file `"`strippedname'.rtf"' if !_rc & "`replace'"~="replace" { * it exists noi di in red `"`strippedname'.rtf exists; specify {opt replace}"' exit 198 } local titleWide 0 local headBorder 2 local N=_N local bottomBorder `N' local totrows `N' * there must be varlist to avoid error *_wordout v* `"`using'"', titleWide(`titleWide') headBorder(`headBorder') bottomBorder(`bottomBorder') replace nopretty _wordout v* using `"`strippedname'"', wordFile(`wordFile') titleWide(`titleWide') /* */ headBorder(`headBorder') bottomBorder(`bottomBorder') replace nopretty local temp `r(documentname)' * strip off "using" and quotes gettoken part rest: temp, parse(" ") gettoken usingTerm second: rest, parse(" ") local cl_word `"{browse `"`usingTerm'"'}"' noi di as txt `"`cl_word'"' } *** LaTeX thing *** (will mess up the original file) if "`tex'"=="tex" { local titleWide 0 local headBorder 1 local N=_N local bottomBorder `N' cap confirm file `"`strippedname'.tex"' if !_rc & "`replace'"~="replace" { * it exists noi di in red `"`strippedname'.tex exists; specify {opt replace}"' exit 198 } * make certain `1' is not `"`using'"' (another context) _texout v* using `"`strippedname'"', texFile(`texFile') titleWide(`titleWide') headBorder(`headBorder') bottomBorder(`bottomBorder') `texopts' replace if `"`texFile'"'=="" { local endName "tex" } else { local endName "`texFile'" } local usingTerm `"`strippedname'.`endName'"' local cl_tex `"{browse `"`usingTerm'"'}"' noi di as txt `"`cl_tex'"' } } } /* quietly */ end ******************************************************************************************** *** ripped from outreg2 Mar 2008 program define autodigits2, rclass version 7.0 * getting the significant digits args input auto less if `input'~=. { local times=0 local left=0 * integer checked by modified mod function if round((`input' - int(`input')),0.0000000001)==0 { local whole=1 } else { local whole=0 * non-interger if `input'<. { * digits that need to be moved if it were only decimals: take the ceiling of log 10 of absolute value of decimals local times=abs(int(ln(abs(`input'-int(`input')))/ln(10)-1)) * the whole number: take the ceiling of log 10 of absolute value local left=int(ln(abs(`input'))/ln(10)+1) } } * assign the fixed decimal values into aadec if `whole'==1 { local aadec=0 } else if .>`left' & `left'>0 { * reduce the left by one if more than zero to accept one extra digit if `left'<=`auto' { local aadec=`auto'-`left'+1 } else { local aadec=0 } } else { local aadec=`times'+`auto'-1 } if "`less'"=="" { * needs to between 0 and 11 if `aadec'<0 { local aadec=0 } *if `aadec'<11 { if `aadec'<7 { * use fixed local valstr "`aadec'f" } else { * use exponential local valstr "`=`auto'-1'e" } } else { * needs to between 0 and 11 local aadec=`aadec'-`less' if `aadec'<0 { local aadec=0 } *if `aadec'<10 { if `aadec'<7 { * use fixed local valstr "`aadec'f" } else { * use exponential local valstr "`=`auto'-1'e" } } * make it exponential if too big if `input'>1000000 & `input'<. { local valstr "`=`auto'-0'e" } * make it exponential if too negative (small) if `input'<-1000000 & `input'<. { local valstr "`=`auto'-0'e" } return scalar value=`aadec' return local valstr="`valstr'" } else { * it is a missing value return scalar value=. return local valstr="missing" } end ******************************************************************************************** * ripped from outreg2 on Apr2009 * 27oct2009 nopretty fixed program define _texout, sortpreserve * based on out2tex version 0.9 4oct01 by john_gallup@alum.swarthmore.edu version 7.0 * add one if only one v* column exists unab list: v* local count: word count `list' if `count'==1 { gen str v2="" order v* } if `count'==0 { exit } if "`1'" == "using" { syntax using/ [, texFile(string) Landscape Fragment NOPRetty PRetty /* */ Fontsize(numlist integer max=1 >=10 <=12) noBorder Cellborder /* */ Appendpage noPAgenum a4 a5 b5 LETter LEGal EXecutive replace /* */ Fast ] if "`pretty'"=="pretty" { local nopretty "" } if "`fast'" == "" { preserve } loadout using `"`using'"', clear local numcol = `r(numcol)' local titleWide = `r(titleWide)' local headBorder = `r(headBorder)' local bottomBorder = `r(bottomBorder)' local totrows = _N local varname "v1" unab statvars : v2-v`numcol' } else { syntax varlist using/, titleWide(int) headBorder(int) bottomBorder(int) /* */ [texFile(string) TOtrows(int 0) Landscape Fragment NOPRetty PRetty /* */ Fontsize(numlist integer max=1 >=10 <=12) noBorder Cellborder /* */ Appendpage noPAgenum a4 a5 b5 LETter LEGal EXecutive replace ] if `totrows'==0 { local totrows = _N } local numcols : word count `varlist' gettoken varname statvars : varlist local fast 1 } if "`pretty'"=="pretty" { local pretty "" } else { local pretty "NOT PRETTY AT ALL" } local colhead1 = `titleWide' + 1 local strow1 = `headBorder' + 1 * insert $<$ to be handled in LaTeX conversion local N=_N forval num=`bottomBorder'/`N' { local temp=v1[`num'] tokenize `"`temp'"', parse (" <") local count 1 local newTex "" local noSpace 0 while `"``count''"'~="" { if `"``count''"'=="<" { local `count' "$<$" local newTex `"`newTex'``count''"' local noSpace 1 } else { if `noSpace'~=1 { local newTex `"`newTex' ``count''"' } else { local newTex `"`newTex'``count''"' local noSpace 0 } } local count=`count'+1 } replace v1=`"`newTex'"' in `num' } *** replace if equation column present count if v1=="EQUATION" if `r(N)'~=0 { tempvar myvar * use v2 instead replace v1 = v2 in `=`bottomBorder'+1'/`totrows' replace v2 = "" in `=`bottomBorder'+1'/`totrows' * change the string length gen str5 `myvar' ="" replace `myvar' =v2 drop v2 ren `myvar' v2 order v1 v2 } /* if file extension specified in `"`using'"', replace it with ".tex" for output local next_dot = index(`"`using'"', ".") if `next_dot' { local using = substr("`using'",1,`=`next_dot'-1') } */ if `"`texFile'"'=="" { local endName "tex" } else { local endName "`texFile'" } local using `"using "`using'.`endName'""' local fsize = ("`fontsize'" != "") if `fsize' { local fontsize "`fontsize'pt" } local lscp = ("`landscape'" != "") if (`lscp' & `fsize') { local landscape ",landscape" } local pretty = ("`pretty'" == "") local cborder = ("`cellborder'" != "") local noborder = ("`border'" != "") local nopagen = ("`pagenum'" != "") local nofrag = ("`fragment'" == "") if `cborder' & `noborder' { di in red "may not specify both cellborder and noborder options" exit 198 } local nopt : word count `a4' `a5' `b5' `letter' `legal' `executive' if `nopt' > 1 { di in red "choose only one of a4, a5, b5, letter, legal, executive" exit 198 } local pagesize "`a4'`a5'`b5'`letter'`legal'`executive'" if "`pagesize'"=="" | "`letter'"!="" { local pwidth "8.5in" local pheight "11in" } else if "`legal'"!="" { local pwidth "8.5in" local pheight "14in" } else if "`executive'"!="" { local pwidth "7.25in" local pheight "10.5in" } else if "`a4'"!="" { local pwidth "210mm" local pheight "297mm" } else if "`a5'"!="" { local pwidth "148mm" local pheight "210mm" } else if "`b5'"!="" { local pwidth "176mm" local pheight "250mm" } if `lscp' { local temp "`pwidth'" local pwidth "`pheight'" local pheight "`temp'" } if "`pagesize'"!="" { local pagesize "`pagesize'paper" if (`lscp' | `fsize') { local pagesize ",`pagesize'" } } if `cborder' & `noborder' { di in red "may not specify both cellborder and noborder options" exit 198 } quietly { tempvar has_eqn st2_row last_st pad0 pad1 pad2_n padN order * replace % with \%, and _ with \_ if <2 $'s (i.e. not an inline equation: $...$ * has_eqn indicates that varname has 2+ $'s gen byte `has_eqn' = index(`varname',"$") * make sure there are 2+ "$" in varname replace `has_eqn' = index(substr(`varname',`has_eqn'+1,.),"$")>0 if `has_eqn'>0 replace `varname'= subinstr(`varname',"_", "\_", .) if !`has_eqn' replace `varname'= subinstr(`varname',"%", "\%", .) if `pretty' { replace `varname'= subinword(`varname',"R-squared", "\$R^2$", 1) in `strow1'/`bottomBorder' replace `varname'= subinstr(`varname'," t stat", " \em t \em stat", 1) in `bottomBorder'/`totrows' replace `varname'= subinstr(`varname'," z stat", " \em z \em stat", 1) in `bottomBorder'/`totrows' } foreach svar of local statvars { /* make replacements for column headings rows of statvars */ replace `has_eqn' = index(`svar',"$") in `colhead1'/`headBorder' replace `has_eqn' = index(substr(`svar',`has_eqn'+1,.),"$")>0 in `colhead1'/`headBorder' if `has_eqn'>0 replace `svar'= subinstr(`svar',"_", "\_", .) in `colhead1'/`headBorder' if !`has_eqn' replace `svar'= subinstr(`svar',"%", "\%", .) in `colhead1'/`headBorder' /* replace <, >, {, }, | with $<$, $>$, \{, \}, and $|$ in stats rows */ /* which can be used as brackets by outstat */ replace `svar'= subinstr(`svar',"<", "$<$", .) in `strow1'/`bottomBorder' replace `svar'= subinstr(`svar',">", "$>$", .) in `strow1'/`bottomBorder' replace `svar'= subinstr(`svar',"{", "\{", .) in `strow1'/`bottomBorder' replace `svar'= subinstr(`svar',"}", "\}", .) in `strow1'/`bottomBorder' replace `svar'= subinstr(`svar',"|", "$|$", .) in `strow1'/`bottomBorder' } if `pretty' { /* make title fonts large; notes & t stats small */ local blarge "\begin{large}" local elarge "\end{large}" local bfnsize "\begin{footnotesize}" local efnsize "\end{footnotesize}" } if `cborder' { local vline "|" } gen str20 `pad0' = "" gen str20 `padN' = "" if `titleWide' { replace `pad0' = "\multicolumn{`numcols'}{`vline'c`vline'}{`blarge'" in 1 / `titleWide' replace `padN' = "`elarge'} \\\" in 1 / `titleWide' } if `bottomBorder' < `totrows' { local noterow1 = `bottomBorder' + 1 replace `pad0' = "\multicolumn{`numcols'}{`vline'c`vline'}{`bfnsize'" in `noterow1' / l replace `padN' = "`efnsize'} \\\" in `noterow1' / l } gen str3 `pad1' = " & " in `colhead1' / `bottomBorder' if `numcols' > 2 { gen str3 `pad2_n' = `pad1' } if `pretty' { /* make stats 2-N small font */ local strow1 = `headBorder' + 1 gen byte `st2_row' = 0 replace `st2_row' = (trim(`varname') == "") in `strow1' / `bottomBorder' /* only stats 2+ */ gen byte `last_st' = (`st2_row' & `varname'[_n+1] != "") /* last stats row */ if !`cborder' { replace `pad0' = "\vspace{4pt}" if `last_st' } replace `pad1' = `pad1' + "`bfnsize'" if `st2_row' if `numcols' > 2 { replace `pad2_n' = "`efnsize'" + `pad2_n' + "`bfnsize'" if `st2_row' } replace `padN' = "`efnsize'" if `st2_row' } replace `padN' = `padN' + " \\\" in `colhead1' / `bottomBorder' if `cborder' { replace `padN' = `padN' + " \hline" } else { if !`noborder' { if `headBorder' { if `titleWide' { replace `padN' = `padN' + " \hline" in `titleWide' } replace `padN' = `padN' + " \hline" in `headBorder' } replace `padN' = `padN' + " \hline" in `bottomBorder' } } local vlist "`pad0' `varname' `pad1'" tokenize `statvars' local ncols_1 = `numcols' - 1 local ncols_2 = `ncols_1' - 1 forvalues v = 1/`ncols_2' { local vlist "`vlist' ``v'' `pad2_n'" } local vlist "`vlist' ``ncols_1'' `padN'" local texheadfootrows = `nofrag' + `pretty' + 1 /* in both headers and footers */ local texheadrow = 2 * `nofrag' + `nopagen' + `texheadfootrows' local texfootrow = `texheadfootrows' local newtotrows = `totrows' + `texheadrow' + `texfootrow' if `newtotrows' > _N { local oldN = _N set obs `newtotrows' } else { local oldN = 0 } gen long `order' = _n + `texheadrow' in 1 / `totrows' local newtexhrow1 = `totrows' + 1 local newtexhrowN = `totrows' + `texheadrow' replace `order' = _n - `totrows' in `newtexhrow1' / `newtexhrowN' sort `order' * insert TeX header lines local ccc : display _dup(`ncols_1') "`vline'c" if `nofrag' { replace `pad0' = "\documentclass[`fontsize'`landscape'`pagesize']{article}" in 1 replace `pad0' = "\setlength{\pdfpagewidth}{`pwidth'} \setlength{\pdfpageheight}{`pheight'}" in 2 replace `pad0' = "\begin{document}" in 3 replace `pad0' = "\end{document}" in `newtotrows' } if `nopagen' { local row = `texheadrow' - 1 - `pretty' replace `pad0' = "\thispagestyle{empty}" in `row' } if `pretty' { local row = `texheadrow' - 1 replace `pad0' = "\begin{center}" in `row' local row = `newtotrows' - `texfootrow' + 2 replace `pad0' = "\end{center}" in `row' } local row = `texheadrow' replace `pad0' = "\begin{tabular}{`vline'l`ccc'`vline'}" in `row' if (!`titleWide' | `cborder') & !`noborder' { replace `pad0' = `pad0' + " \hline" in `row' } local row = `newtotrows' - `texfootrow' + 1 replace `pad0' = "\end{tabular}" in `row' outfile `vlist' `using' in 1/`newtotrows', `replace' runtogether * delete new rows created for TeX table, if any if `oldN' { keep in 1/`totrows' } } /* quietly */ end /* end _texout */ ******************************************************************************************** * ripped from outreg2 on Mar2009 program define _wordout, sortpreserve rclass version 7.0 * based on version 0.9 4oct01 by john_gallup@alum.swarthmore.edu if "`1'" == "using" { syntax using/ [, wordFile(string) Landscape Fragment noPRetty /* */ Fontsize(numlist max=1 >0) noBorder Cellborder /* */ Appendpage PAgesize(string) /* */ Lmargin(numlist max=1 >=0.5) Rmargin(numlist max=1 >=0.5) /* */ Tmargin(numlist max=1 >=0.5) Bmargin(numlist max=1 >=0.5) /* */ replace Fast] if "`fast'" == "" {preserve} loadout using `"`using'"', clear local numcol = `r(numcol)' local titleWide = `r(titleWide)' local headBorder = `r(headBorder)' local bottomBorder = `r(bottomBorder)' local totrows = _N local varname "v1" unab statvars : v2-v`numcol' } else { syntax varlist using/, titleWide(int) headBorder(int) bottomBorder(int) /* */ [wordFile(string) TOtrows(int 0) Landscape Fragment noPRetty /* */ Fontsize(numlist max=1 >0) noBorder Cellborder /* */ Appendpage PAgesize(string) /* */ Lmargin(numlist max=1 >=0.5) Rmargin(numlist max=1 >=0.5) /* */ Tmargin(numlist max=1 >=0.5) Bmargin(numlist max=1 >=0.5) /* */ replace] if `totrows'==0 { local totrows = _N } local numcols : word count `varlist' gettoken varname statvars : varlist local fast 1 } local colhead1 = `titleWide' + 1 local strow1 = `headBorder' + 1 *** replace if equation column present local hack 0 count if v1=="EQUATION" if `r(N)'~=0 { * use v2 instead replace v1 = v2 in `=`bottomBorder'+1'/`totrows' replace v2 = "" in `=`bottomBorder'+1'/`totrows' * change the string length gen str5 myvar ="" replace myvar =v2 drop v2 ren myvar v2 order v1 v2 local hack 1 } /* if file extension specified in `"`using'"', replace it with ".rtf" for output local next_dot = index(`"`using'"', ".") if `next_dot' { local using = substr(`"`using'"',1,`=`next_dot'-1') } */ if `"`wordFile'"'=="" { local endName "rtf" } else { local endName "`wordFile'" } local using `"using "`using'.`endName'""' return local documentname `"`using'"' if "`fontsize'" == "" { local fontsize "12" } local lscp = ("`landscape'" != "") local pretty = ("`pretty'" == "") local cborder = ("`cellborder'" != "") local noborder = ("`border'" != "") local stdborder = (!`noborder' & !`cborder') local nopagen = ("`pagenum'" != "") local nofrag = ("`fragment'" == "") if `cborder' & !`noborder' { di in red "may not specify both cellborder and noborder options" exit 198 } * reformat "R-squared" and italicize "t" or "z" if `pretty' { quietly { replace `varname'= subinword(`varname',"R-squared", "{\i R{\super 2}}", 1) in `strow1'/`bottomBorder' replace `varname'= subinstr(`varname'," t stat", " {\i t} stat", 1) in `bottomBorder'/`totrows' replace `varname'= subinstr(`varname'," z stat", " {\i z} stat", 1) in `bottomBorder'/`totrows' } } * font sizes in points*2 local font2 = int(`fontsize'*2) if `pretty' { /* make title fonts large; notes & t stats small */ local fslarge = "\fs" + string(int(`font2' * 1.2)) local fsmed = "\fs" + string(`font2') local fssmall = "\fs" + string(int(`font2' * 0.8)) local sa0 "\sa0" /* put space after t stats rows */ local gapsize = int(`fontsize'*0.4*20) /* 40% of point size converted to twips */ local sa_gap "\sa`gapsize'" } else { local fs0 = "\fs" + string(`font2') } local onecolhead = (`headBorder' - `titleWide' == 1) /* onecolhead = true if only one row of column headings */ if `stdborder' { if !`onecolhead' { * runs here *local trbrdrt "\clbrdrt\brdrs" /* table top is overlined */ *local trbrdrt "\trbrdrt\brdrs" /* table top is overlined */ local clbrdr_uo "\clbrdrt\brdrs" /* cells are overlined */ local clbrdr_ul "\clbrdrb\brdrs" /* cells are underlined */ } else { /* cells are over- and underlined */ local clbrdr_ul "\clbrdrt\brdrs\clbrdrb\brdrs" } local trbrdrb "\trbrdrb\brdrs" } if `cborder' { /* if !cborder then clbrdr is blank */ local clbrdr "\clbrdrt\brdrs\clbrdrb\brdrs\clbrdrl\brdrs\clbrdrr\brdrs" } * figure out max str widths to make cell boundaries * cell width in twips = (max str width) * (pt size) * 12 * (12 found by trial and error) local twipconst = int(`fontsize' * 12 ) tempvar newvarname qui gen str80 `newvarname' = `varname' in `strow1'/`bottomBorder' local newvarlist "`newvarname' `statvars'" qui compress `newvarlist' local cellpos = 0 foreach avar of local newvarlist { local strwidth : type `avar' local strwidth = subinstr("`strwidth'", "str", "", .) local strwidth = `strwidth' + 1 /* add buffer */ local cellpos = `cellpos' + `strwidth'*`twipconst' * hacking if `hack'==1 & "`avar'"=="`newvarname'" & `cellpos'<1350 { local cellpos=1350 } local clwidths "`clwidths'`clbrdr'\cellx`cellpos'" * put in underline at bottom of header in clwidth_ul local clwidth_ul "`clwidth_ul'`clbrdr_ul'\cellx`cellpos'" * put in overline local clwidth_ol "`clwidth_ol'`clbrdr_uo'\cellx`cellpos'" } if `stdborder' { if `onecolhead' { local clwidth1 "`clwidth_ul'" } else { local clwidth1 "`clwidths'" local clwidth2 "`clwidth_ul'" } local clwidth3 "`clwidths'" } else{ local clwidth1 "`clwidths'" } * statistics row formatting tempvar prettyfmt qui gen str12 `prettyfmt' = "" /* empty unless `pretty' */ if `pretty' { * make stats 2-N small font tempvar st2_row last_st quietly { gen byte `st2_row' = 0 replace `st2_row' = (trim(`varname') == "") in `strow1' / `bottomBorder' /* only stats 2+ */ gen byte `last_st' = (`st2_row' & `varname'[_n+1] != "") /* last stats row */ replace `prettyfmt' = "`sa0'" in `strow1' / `bottomBorder' replace `prettyfmt' = "`sa_gap'" if `last_st' in `strow1' / `bottomBorder' replace `prettyfmt' = `prettyfmt' + "`fsmed'" if !`st2_row' in `strow1' / `bottomBorder' replace `prettyfmt' = `prettyfmt' + "`fssmall'" if `st2_row' in `strow1' / `bottomBorder' } } * create macros with file write contents forvalues row = `colhead1'/`bottomBorder' { local svarfmt`row' `"(`prettyfmt'[`row']) "\ql " (`varname'[`row']) "\cell""' foreach avar of local statvars { local svarfmt`row' `"`svarfmt`row''"\qc " (`avar'[`row']) "\cell""' } local svarfmt`row' `"`svarfmt`row''"\row" _n"' } * write file tempname rtfile file open `rtfile' `using', write `replace' file write `rtfile' "{\rtf1`fs0'" _n /* change if not roman: \deff0{\fonttbl{\f0\froman}} */ * title if `titleWide' { file write `rtfile' "\pard\qc`fslarge'" _n forvalues row = 1/`titleWide' { file write `rtfile' (`varname'[`row']) "\par" _n } } * The top line file write `rtfile' "\trowd\trgaph75\trleft-75\intbl\trqc`fsmed'`trbrdrt'`clwidth_ol'" _n *file write `rtfile' "\trowd\trgaph75\trleft-75\intbl\trqc`fsmed'`trbrdrt'`clwidth1'" _n local headBorder_1 = `headBorder' - 1 * write header rows 1 to N-1 forvalues row = `colhead1'/`headBorder_1' { file write `rtfile' `svarfmt`row'' * turn off the overlining the first time it's run file write `rtfile' "\trowd\trgaph75\trleft-75\trqc`clwidth3'" _n } file write `rtfile' "\trowd\trgaph75\trleft-75\trqc`clwidth2'" _n * write last header row file write `rtfile' `svarfmt`headBorder'' local bottomBorder_1 = `bottomBorder' - 1 /* turn off cell underlining */ file write `rtfile' "\trowd\trgaph75\trleft-75\trqc`clwidth3'" _n * table contents forvalues row = `strow1'/`bottomBorder_1' { file write `rtfile' `svarfmt`row'' } if `stdborder' { /* write last row */ *file write `rtfile' "\trowd\trgaph75\trleft-75\trqc`trbrdrb'`clwidths'" _n * make it underline file write `rtfile' "\trowd\trgaph75\trleft-75\trqc`trbrdrb'`clwidth_ul'" _n file write `rtfile' `svarfmt`bottomBorder'' } /* write notes rows */ if `bottomBorder' < `totrows' { local noterow1 = `bottomBorder' + 1 file write `rtfile' "\pard\qc`fssmall'" _n forvalues row = `noterow1'/`totrows' { file write `rtfile' (`varname'[`row']) "\par" _n } } * write closing curly bracket file write `rtfile' "}" end /* end _wordout */ ******************************************************************************************** * ripped from outreg2 on Mar2009 program define _xmlout version 7.0 versionSet version `version' * emulates the output produced by xmlsave: * xmlsave myfile, replace doctype(excel) legible syntax using/ [, excelFile(string) LEGible noNAMes titleWide(integer 0) /* */ headBorder(integer 10) bottomBorder(integer 10) ] * assumes all columns are string; if numbers, then the format needs to be checked *local legible legible if "`legible'"=="legible" { local _n "_n" } tempname source saving if `"`excelFile'"'=="" { local endName "xml" } else { local endName "`excelFile'" } local save `"`using'.`endName'"' *file open `source' using `"`using'"', read file open `saving' using `"`save'"', write text replace *file write `saving' `"`macval(line)'"' file write `saving' `""' `_n' file write `saving' `""' `_n' file write `saving' `""' `_n' file write `saving' `""' `_n' file write `saving' `""' `_n' file write `saving' `""' `_n' file write `saving' `""' `_n' file write `saving' `""' `_n' file write `saving' `""' `_n' file write `saving' `""' `_n' file write `saving' `""' `_n' file write `saving' `""' `_n' file write `saving' `"False"' `_n' file write `saving' `"False"' `_n' file write `saving' `""' `_n' file write `saving' `""' `_n' * styles file write `saving' `""' `_n' * bold & (center) file write `saving' `""' `_n' * top border & center file write `saving' `""' `_n' * main body (no border) & center file write `saving' `""' `_n' * bottom border & center file write `saving' `""' `_n' * goldfish (no border, left-justified) file write `saving' `""' `_n' * top border file write `saving' `""' `_n' * main body (no border) file write `saving' `""' `_n' * bottom border & center file write `saving' `""' `_n' file write `saving' `""' `_n' file write `saving' `""' `_n' file write `saving' `""' `_n' file write `saving' `""' `_n' * set up file size qui describe, short local N=_N local tableN `N' if "`names'"~="nonames" { * add one if variable names are to be inserted local tableN=`N'+1 } else { * add one for the look local tableN=`N'+1 } file write `saving' `""' `_n' * should be tostring and format here if dealing with numbers ds8 * write the variable names at the top or empty row if "`names'"~="nonames" { file write `saving' `""' `_n' foreach var in `dsVarlist' { if "`Version7'"~="" { file write `saving' `"`macval(var)'"' _n } else { file write `saving' `"`var'"' _n } } file write `saving' `""' `_n' } else { file write `saving' `""' `_n' file write `saving' `""' `_n' } * title local count `titleWide' local total 1 while `count'~=0 { xmlstack, saving(`saving') dsVarlist(`dsVarlist') num(`total') n(`N') style(`" ss:StyleID="s1""') style1(`" ss:StyleID="s1""') local count=`count'-1 local total=`total'+1 } * top border local count=`total' forval num=`count'/`count' { xmlstack, saving(`saving') dsVarlist(`dsVarlist') num(`num') n(`N') style(`" ss:StyleID="s21""') style1(`" ss:StyleID="s31""') local total=`total'+1 } * ctitle local count=`total' forval num=`count'/`headBorder' { xmlstack, saving(`saving') dsVarlist(`dsVarlist') num(`num') n(`N') style(`" ss:StyleID="s22""') style1(`" ss:StyleID="s32""') local total=`total'+1 } * top border (closes ctitle) local count=`total' forval num=`count'/`count' { xmlstack, saving(`saving') dsVarlist(`dsVarlist') num(`num') n(`N') style(`" ss:StyleID="s21""') style1(`" ss:StyleID="s31""') local total=`total'+1 } * body local count=`total' forval num=`count'/`=`bottomBorder'-1' { xmlstack, saving(`saving') dsVarlist(`dsVarlist') num(`num') n(`N') style(`" ss:StyleID="s22""') style1(`" ss:StyleID="s32""') local total=`total'+1 } * bottom border (closes body) local count=`total' forval num=`count'/`count' { xmlstack, saving(`saving') dsVarlist(`dsVarlist') num(`num') n(`N') style(`" ss:StyleID="s23""') style1(`" ss:StyleID="s33""') local total=`total'+1 } * goldfish if `N'>`total' { local count=`total' forval num=`count'/`N' { xmlstack, saving(`saving') dsVarlist(`dsVarlist') num(`num') n(`N') style(`" ss:StyleID="s24""') style1(`" ss:StyleID="s24""') local total=`total'+1 } } /* forval num=1/`N' { file write `saving' `""' `_n' *foreach var in `=r(varlist)' { foreach var in `dsVarlist' { *local stuff `=`var'[`num']' local stuff=`var' in `num' local stuff : subinstr local stuff "<" "<", all local stuff : subinstr local stuff ">" ">", all * the main body if "`Version7'"~="" { file write `saving' `"`macval(stuff)'"' `_n' } else { file write `saving' `"`stuff'"' `_n' } } file write `saving' `""' `_n' } */ file write `saving' `"
"' `_n' file write `saving' `""' `_n' file write `saving' `"False"' `_n' file write `saving' `"False"' `_n' file write `saving' `""' `_n' file write `saving' `"
"' `_n' file write `saving' `"
"' `_n' * close out with the last line *file write `saving' _n *file close `source' file close `saving' end /* _xmlout */ ******************************************************************************************** * ripped from outreg2 on Mar2009 program define xmlstack syntax, saving(string) dsVarlist(string) num(numlist) n(numlist) style(string) style1(string) local N `n' *forval num=1/`N' { file write `saving' `""' `_n' local count 0 *foreach var in `=r(varlist)' { foreach var in `dsVarlist' { if `count'==0 { local STYLE `"`style1'"' } else { local STYLE `"`style'"' } *local stuff `=`var'[`num']' local stuff=`var' in `num' local stuff : subinstr local stuff "<" "<", all local stuff : subinstr local stuff ">" ">", all * the main body if "`Version7'"~="" { file write `saving' `"`macval(stuff)'"' `_n' } else { file write `saving' `"`stuff'"' `_n' } local count=`count'+1 } file write `saving' `""' `_n' *} end /* xmlstack */ ******************************************************************************************** *** ripped from outreg2 Mar 2009 program define ds8 * get you the list of variable like -ds- does for version 8 version 7.0 qui ds if "`r(varlist)'"=="" { local dsVarlist "" foreach var of varlist _all { local dsVarlist "`dsVarlist' `var'" } c_local dsVarlist `dsVarlist' } else { c_local dsVarlist `r(varlist)' } end ******************************************************************************************** program define stringMaker * makes a string out variables tempvar temp foreach var of varlist _all { cap confirm string var `var' if _rc { * not a string gen str2 `temp'="" replace `temp' = string(`var') move `var' `temp' drop `var' ren `temp' `var' } } end ******************************************************************************************** * cdout 1.0.1 Apr2009 by roywada@hotmail.com * opens the current directory for your viewing pleasure * the following disabled 14oct2009: cap winexec cmd /c start . * displays "current directory" instead of cdout or the folder location * displays dir" instead of cdout or the folder location program define _cdout cap version 7.0 *cap winexec cmd /c start . *cap !start cmd /c start . if _rc~=0 { * version 6 or earlier di `"{stata `"cdout"':dir}"' } else { * invisible to Stata 7 local Version7 local Version7 `c(stata_version)' if "`Version7'"=="" { * it is version 7 or earlier di `"{stata `"cdout"':dir}"' } else if `Version7'>=8.0 { version 8.0 di `"{browse `"`c(pwd)'"':dir}"' } } end ******************************************************************************************** * chewfile version 1.0.1 17Aug2009 by roywada@hotmail.com * quick and easy way to chew and digest excessive large ASCII file program define _chewfile version 8.0 syntax using/, [save(string) begin(numlist max=1) end(string) clear parse(string) replace semiclear] if `"`parse'"'=="" { local parse `"`=char(9)'"' } if "`begin'"=="" { local begin 1 } if "`end'"=="" { local end . } if "`clear'"=="" & `"`save'"'=="" { if "`semiclear'"=="" { noi di in red "must specify {opt clear} or {opt save( )} exit 198 } } if "`semiclear'"=="semiclear" { qui drop * qui set obs 0 } else if "`clear'"=="clear" { clear qui set obs 0 } if `"`save'"'=="" { tempfile dump local save `dump' } tempname fh outout local linenum = 0 file open `fh' using `"`using'"', read qui file open `outout' using `"`save'"', write `replace' file read `fh' line while r(eof)==0 { local linenum = `linenum' + 1 local addedRow 0 if `linenum'>=`begin' & `linenum'<=`end' { if `addedRow'==0 { qui set obs `=`=_N'+1' } *display %4.0f `linenum' _asis `"`macval(line)'"' file write `outout' `"`macval(line)'"' _n if "`clear'"=="clear" | "`semiclear'"=="semiclear" { tokenize `"`macval(line)'"', parse(`"`parse'"') local num 1 local colnum 1 while "``num''"~="" { local needOneMore 0 if `"``num''"'~=`"`parse'"' { cap gen str3 var`colnum'="" cap replace var`colnum'="``num''" in `linenum' if _rc~=0 { qui set obs `=`=_N'+1' cap replace var`colnum'="``num''" in `linenum' local addedRow 1 } *local colnum=`colnum'+1 } else { cap gen str3 var`colnum'="" local colnum=`colnum'+1 } local num=`num'+1 } } } file read `fh' line } file close `fh' file close `outout' end ******************************************************************************************** * 03nov2009, ripped from outreg2 on 05nov2009 prog define versionSet * sends back the version as c_local version 7.0 * invisible to Stata 7 cap local Version7 `c(stata_version)' c_local Version7 `Version7' if "`Version7'"=="" { * it is version 7 c_local version 7 } else if `Version7'>=8.2 { version 8.2 c_local version 8.2 } if "`Version7'"=="" { c_local bind "" } else { c_local bind "bind" } end exit * version 1.0.1 May2009 logout by roywada@hotmail.com cap no longer takes off the bottom line noauto auto( ) dec( ) hooked up _logfix split into _infix, unfinished logleft done, not implemented caplog has correct version control, enabling eret list value labels handled as proposed by Karl Keesman at sales@survey-design.com.au fix handles the horizontal lines *ssc de version 1.0.2 05May2009 logout by roywada@hotmail.com the bottomline no longer taken off by unwrap function the horizontal lines starting in the middle handled during delimited routine * version 1.0.3 14oct2009 fixed the compound quotes for `save' unwraps correctly (previously left an extra space) fixcut( ) option _cdout inserted _chewfile inserted range( ) option * 1.0.4 di before _cdout nopretty for _texout fixed?? versionSet error with fixcut( ) rectified _infix drop vertical lines before horizontal line needs work: logout, save(mytable) excel replace: eret list plus the ":" wipe or not user specified infix dataout circa Apr 2009 needs to be replaced with version 1.0.4 07sep2009