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.

2673 lines
68 KiB
Plaintext

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

*! 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''="<22><EFBFBD>" if ``one''=="-" & ``two''=="-" & ``three''=="-"
replace ``two''="<22><EFBFBD>" if ``one''=="<22><EFBFBD>" & ``two''=="-" & ``three''=="-"
replace ``three''="<22><EFBFBD>" if ``one''=="<22><EFBFBD>" & ``two''=="<22><EFBFBD>" & ``three''=="-"
replace ``three''="<22><EFBFBD>" if ``one''=="<22><EFBFBD>" & ``two''=="<22><EFBFBD>" & ``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'~="<22><EFBFBD>"
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]-`parameter' & height[_n-1]~=.)
gen minima`wave'=.
*replace minima`wave'=1 if trend`wave'==-1 & height<`parameter'
replace minima`wave'=1 if trend`wave'==-1
* replace if still dropping in height
forval num=1/10 {
replace minima`wave'=0 if minima`wave'==1 & 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' `"<?xml version="1.0" encoding="US-ASCII" standalone="yes"?>"' `_n'
file write `saving' `"<?mso-application progid="Excel.Sheet"?>"' `_n'
file write `saving' `"<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet""' `_n'
file write `saving' `" xmlns:o="urn:schemas-microsoft-com:office:office""' `_n'
file write `saving' `" xmlns:x="urn:schemas-microsoft-com:office:excel""' `_n'
file write `saving' `" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet""' `_n'
file write `saving' `" xmlns:html="http://www.w3.org/TR/REC-html40">"' `_n'
file write `saving' `"<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">"' `_n'
file write `saving' `"<Author></Author>"' `_n'
file write `saving' `"<LastAuthor></LastAuthor>"' `_n'
file write `saving' `"<Created></Created>"' `_n'
file write `saving' `"<LastSaved></LastSaved>"' `_n'
file write `saving' `"<Company></Company>"' `_n'
file write `saving' `"<Version></Version>"' `_n'
file write `saving' `"</DocumentProperties>"' `_n'
file write `saving' `"<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">"' `_n'
file write `saving' `"<ProtectStructure>False</ProtectStructure>"' `_n'
file write `saving' `"<ProtectWindows>False</ProtectWindows>"' `_n'
file write `saving' `"</ExcelWorkbook>"' `_n'
file write `saving' `"<Styles>"' `_n'
* styles
file write `saving' `"<Style ss:ID="Default" ss:Name="Normal">"' `_n'
file write `saving' `"<Alignment ss:Vertical="Bottom"/>"' `_n'
file write `saving' `"<Borders/>"' `_n'
file write `saving' `"<Font/>"' `_n'
file write `saving' `"<Interior/>"' `_n'
file write `saving' `"<NumberFormat/>"' `_n'
file write `saving' `"<Protection/>"' `_n'
file write `saving' `"</Style>"' `_n'
* bold & (center)
file write `saving' `"<Style ss:ID="s1">"' `_n'
*file write `saving' `"<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>"' `_n'
file write `saving' `"<Font ss:Bold="1" ss:Size='12'/>"' `_n'
file write `saving' `"<NumberFormat/>"' `_n'
file write `saving' `"</Style>"' `_n'
* top border & center
file write `saving' `"<Style ss:ID="s21">"' `_n'
file write `saving' `"<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>"' `_n'
file write `saving' `"<NumberFormat/>"' `_n'
file write `saving' `"<Borders>"' `_n'
file write `saving' `"<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>"' `_n'
file write `saving' `"</Borders>"' `_n'
file write `saving' `"</Style>"' `_n'
* main body (no border) & center
file write `saving' `"<Style ss:ID="s22">"' `_n'
file write `saving' `"<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>"' `_n'
file write `saving' `"<NumberFormat/>"' `_n'
file write `saving' `"</Style>"' `_n'
* bottom border & center
file write `saving' `"<Style ss:ID="s23">"' `_n'
file write `saving' `"<Alignment ss:Horizontal="Center" ss:Vertical="Bottom"/>"' `_n'
file write `saving' `"<NumberFormat/>"' `_n'
file write `saving' `"<Borders>"' `_n'
file write `saving' `"<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>"' `_n'
file write `saving' `"</Borders>"' `_n'
file write `saving' `"</Style>"' `_n'
* goldfish (no border, left-justified)
file write `saving' `"<Style ss:ID="s24">"' `_n'
file write `saving' `"<NumberFormat/>"' `_n'
file write `saving' `"</Style>"' `_n'
* top border
file write `saving' `"<Style ss:ID="s31">"' `_n'
file write `saving' `"<Borders>"' `_n'
file write `saving' `"<Border ss:Position="Top" ss:LineStyle="Continuous" ss:Weight="1"/>"' `_n'
file write `saving' `"</Borders>"' `_n'
file write `saving' `"</Style>"' `_n'
* main body (no border)
file write `saving' `"<Style ss:ID="s32">"' `_n'
file write `saving' `"<Borders/>"' `_n'
file write `saving' `"</Style>"' `_n'
* bottom border & center
file write `saving' `"<Style ss:ID="s33">"' `_n'
file write `saving' `"<Borders>"' `_n'
file write `saving' `"<Border ss:Position="Bottom" ss:LineStyle="Continuous" ss:Weight="1"/>"' `_n'
file write `saving' `"</Borders>"' `_n'
file write `saving' `"</Style>"' `_n'
file write `saving' `"</Styles>"' `_n'
file write `saving' `"<Names>"' `_n'
file write `saving' `"</Names>"' `_n'
file write `saving' `"<Worksheet ss:Name="Sheet1">"' `_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' `"<Table ss:ExpandedColumnCount="`r(k)'" ss:ExpandedRowCount="`tableN'""' `_n'
file write `saving' `" x:FullColumns="1" x:FullRows="1">"' `_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' `"<Row>"' `_n'
foreach var in `dsVarlist' {
if "`Version7'"~="" {
file write `saving' `"<Cell ss:StyleID="s1"><Data ss:Type="String">`macval(var)'</Data></Cell>"' _n
}
else {
file write `saving' `"<Cell ss:StyleID="s1"><Data ss:Type="String">`var'</Data></Cell>"' _n
}
}
file write `saving' `"</Row>"' `_n'
}
else {
file write `saving' `"<Row>"' `_n'
file write `saving' `"</Row>"' `_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' `"<Row>"' `_n'
*foreach var in `=r(varlist)' {
foreach var in `dsVarlist' {
*local stuff `=`var'[`num']'
local stuff=`var' in `num'
local stuff : subinstr local stuff "<" "&lt;", all
local stuff : subinstr local stuff ">" "&gt;", all
* the main body
if "`Version7'"~="" {
file write `saving' `"<Cell`style'><Data ss:Type="String">`macval(stuff)'</Data></Cell>"' `_n'
}
else {
file write `saving' `"<Cell`style'><Data ss:Type="String">`stuff'</Data></Cell>"' `_n'
}
}
file write `saving' `"</Row>"' `_n'
}
*/
file write `saving' `"</Table>"' `_n'
file write `saving' `"<WorksheetOptions xmlns="urn:schemas-microsoft-com:office:excel">"' `_n'
file write `saving' `"<ProtectedObjects>False</ProtectedObjects>"' `_n'
file write `saving' `"<ProtectedScenarios>False</ProtectedScenarios>"' `_n'
file write `saving' `"</WorksheetOptions>"' `_n'
file write `saving' `"</Worksheet>"' `_n'
file write `saving' `"</Workbook>"' `_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' `"<Row>"' `_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 "<" "&lt;", all
local stuff : subinstr local stuff ">" "&gt;", all
* the main body
if "`Version7'"~="" {
file write `saving' `"<Cell`STYLE'><Data ss:Type="String">`macval(stuff)'</Data></Cell>"' `_n'
}
else {
file write `saving' `"<Cell`STYLE'><Data ss:Type="String">`stuff'</Data></Cell>"' `_n'
}
local count=`count'+1
}
file write `saving' `"</Row>"' `_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