*! version 1.1.4 27Sep95 (dm36: STB-28) program define compdta version 4.0 local varlist "opt ex" local if "opt" local in "opt" local using "req noprefix" local options "Keep(string) List Noisily Sort" parse "`*'" qui describe if _result(7) { error 4 } qui count `if' `in' if !_result(1) { di in red "Master data (`master') error:" error 2000 } local master "$S_FN" local srt_m : sortedby tempname Keep List Min Noi scalar `Keep' = ("`keep'" != "") if !`Keep' { preserve } scalar `Min' = index("`using'", ".dta") if !`Min' { local using "`using'.dta" } if "`noisily'" == "" { local noisily "quietly" } else { local noisily "noisily" } scalar `List' = ("`list'" != "") scalar `Min' = ("`keep'" == "min") qui use `using', replace global S_FN "" if "`if'`in'" != "" { qui keep `if' `in' } if !_N { di in red "Using data (`using') error:" error 2000 } order `varlist' keep `varlist' `noisily' di "Note: compressing using data (`using'):" `noisily' compress qui describe local n_u = _result(1) local p_u = _result(2) local w_u = _result(3) local srt_u : sortedby if "`srt_m'" != "`srt_u'" { `noisily' di "WARNING: Master data (`master') sorted by `srt_m'" `noisily' di " Using data (`using') sorted by `srt_u'" } if ("`srt_m'" != "") & ("`sort'" != "") { sort `srt_m' } parse "`varlist'", parse(" ") local Uvar "" local i = 1 while "``i''" != "" { local xname "``i''" if length("`xname'") < 8 { local xname "`xname'_" rename ``i'' `xname' } else { local j = 8 capture rename ``i'' ? while (_rc) & (`j' > 0) { local xj = substr("`xname'", `j', 1) if "`xj'" != "_" { local xj "_" } else if "`xj'" == lower("`xj'") { local xj = upper("`xj'") } else { local xj = lower("`xj'") } if `j' == 1 { local xname = "`xj'" + substr("`xname'", 2, .) } else { local xname = substr("`xname'", 1, `j'-1) + "`xj'" /* */ + substr("`xname'", `j'+1, .) } local j = `j' - 1 capture rename ``i'' `xname' } if _rc { error _rc } } local Uvar "`Uvar' `xname'" local i = `i' + 1 } tempfile Using qui save `Using' qui use `master', replace if "`srt_m'" != "" { sort `srt_m' } global S_FN "" if "`if'`in'" != "" { qui keep `if' `in' } order `varlist' keep `varlist' `noisily' di "Note: compressing master data (`master'):" `noisily' compress qui describe if _result(1) != `n_u' { di in red "No. of cases mismatch>> ", _result(1), /* */ "in `master', `n_u' in `using'" error 499 } else if _result(2) != `p_u' { di in red "No. of variables mismatch>> ", _result(2), /* */ "in `master', `p_u' in `using'" error 499 } `noisily' di "Note: merge needs", /* */ "maxvar =", _result(2)+`p_u'+1+`Keep', /* */ "width =", _result(3)+`w_u'+1+2*`Keep'+3*`Min' qui merge using `Using' if "`keep'" != "" { qui gen int _compdta = 0 lab var _compdta "No. of mismatches" } di "" local i = 1 while "``i''" != "" { local xname : word `i' of `Uvar' qui replace _merge = (``i'' != `xname') qui count if _merge if _result(1) { di _result(1), in green "mismatches in ``i''" _continue if `List' { list ``i'' `xname' if ``i'' != `xname', nolabel } else { di "" } } else `noisily' di in green _result(1), "mismatches in ``i''" if `Keep' { if `Min' { qui capture replace ``i'' = . if !_merge if _rc { qui replace ``i'' = "" if !_merge qui replace `xname' = "" if !_merge } else { qui replace `xname' = . if !_merge } } if _result(1) { label var `xname' "``i'' in `using'" move `xname' ``i'' move ``i'' `xname' qui replace _compdta = _compdta + _merge } else { drop `xname' if `Min' { drop ``i'' } } } local i = `i' + 1 } drop _merge if `Min' { capture drop _id qui gen long _id = _n lab var _id "Observation number" qui drop if !_compdta } qui compress end