*! version 1.0.2 22apr2012 Daniel Klein pr usesome ,sclass vers 10.1 syntax [anything(id = "varspec")] using/ /* */ [ , clear NOT in(str) noLabel findname findnamenot * ] * clear ok if ("`clear'" == "") & (c(changed)) err 4 * ds or findname if (`"`macval(options)'"' != "") { if (`: list posof "not" in options') { di as err "option not not allowed" e 198 } loc ds 1 } else loc ds 0 if ("`findname'`findnamenot'" != "") { if ("`findname'" != "") & ("`findnamenot'" != "") { di as err "may not combine findname and findnamenot" e 198 } if !(`ds') { di as err "findname options required" e 198 } if ("`findnamenot'" != "") loc options `options' not loc cmd findname } else loc cmd ds * parse anything if ("`anything'" == "") & !(`ds') { loc anything * } foreach x in * _all { if (`: list posof "`x'" in anything') { if ("`not'" != "") err 2000 loc anything loc ds 0 loc uservar * continue ,br } } if ("`anything'" != "") { while ("`anything'" != "") { gettoken tok anything : anything ,m(par) if ("`par'" == "(") { mata : st_local("has_k", /* */ strofreal(strpos(st_local("tok"), "k"))) if (`has_k') { if ("`nv'" == "") { qui d using `"`using'"' ,s loc nv = r(k) } loc tok : subinstr loc tok "k" "`nv'" ,all mata : st_local("has_dash", /* */ strofreal(strpos(st_local("tok"), "-"))) mata : st_local("has_ast", /* */ strofreal(strpos(st_local("tok"), "*"))) if (`has_dash') | (`has_ast') { mata : st_local("tok", /* */ stritrim(st_local("tok"))) foreach x in - * { loc tok : subinstr loc tok /* */ "`x' " "`x'" ,all loc tok : subinstr loc tok /* */ " `x' " "`x'" ,all loc tok : subinstr loc tok /* */ " `x'" "`x'" ,all } loc todo `tok' mata : st_local("has_dash", /* */ strofreal(strpos(st_local("todo"), "-"))) mata : st_local("has_ast", /* */ strofreal(strpos(st_local("todo"), "*"))) while (`has_dash') | (`has_ast') { gettoken nxt todo : todo ,p("/ ") if !(strpos("`nxt'", "-")) /* */ & !(strpos("`nxt'", "*")) continue loc res = `nxt' loc tok : /* */ subinstr loc tok "`nxt'" "`res'" ,all mata : st_local("has_dash", /* */ strofreal(strpos(st_local("todo"), "-"))) mata : st_local("has_ast", /* */ strofreal(strpos(st_local("todo"), "*"))) } } } numlist "`tok'" ,int r(>0) loc tok `r(numlist)' loc usernum `usernum' `tok' continue } loc uservar `uservar' `tok' } loc usernum : list uniq usernum loc uservarc : subinstr loc uservar "-" " " ,all c(loc dsh) loc uservar : subinstr loc uservar "~" "*" ,all if (`dsh') { mata : st_local("uservar", /* */ stritrim(st_local("uservar"))) loc uservar : subinstr loc uservar "- " "-" ,all loc uservar : subinstr loc uservar " - " "-" ,all loc uservar : subinstr loc uservar " -" "-" ,all } loc uservar : list uniq uservar } loc nnum : word count `usernum' if (`nnum' >= c(maxvar)) err 900 * set not and in range loc dreep = cond("`not'" == "", "keep", "drop") if ("`in'" != "") loc in in `in' * get varlist from filename qui d `uservarc' using `"`using'"' ,s varl loc varlist `r(varlist)' loc nv = r(k) * usernumlist to uservar if (`nnum') { mata : st_local("nmax", /* */ strofreal(rowmax(strtoreal(tokens(st_local("usernum")))))) if (`nmax' > `nv') err 125 mata : st_local("var", invtokens(tokens(st_local("varlist")) /* */ [(strtoreal(tokens(st_local("usernum"))))])) loc uservar `uservar' `var' loc uservar : list uniq uservar } * parse uservar (create usevars) if ("`uservar'" != "") { loc usevars : list varlist & uservar loc uservar : list uservar - usevars token `uservar' forv j = 1/`: word count `uservar'' { loc var : subinstr loc `j' "-" " " ,c(loc dsh) if (`dsh') { loc f : list posof "`: word 1 of `var''" in varlist loc t : list posof "`: word 2 of `var''" in varlist if (`t' < `f') { di as err "variables out of order" e 111 } mata : st_local("var", /* */ invtokens(tokens(st_local("varlist"))[(`f'..`t')])) } else { mata : st_local("var", invtokens(select /* */ (tokens(st_local("varlist")), /* */ strmatch(tokens(st_local("varlist")), /* */ st_local("var"))))) } loc usevars `usevars' `var' } loc usevars : list uniq usevars } * can do fast if !(`ds') { if ("`not'" != "") loc usevars : list varlist - usevars _desc `"`using'"' `: word count `usevars'' `nv' preserve qui u `usevars' using `"`using'"' `in' ,clear `label' restore ,not e 0 // done } else if (`nv' < c(maxvar)) { preserve qui u `"`using'"' `in' ,clear `label' cap `cmd' ,`options' if _rc { cap noi `cmd' ,`options' e _rc } loc usevars `usevars' `r(varlist)' loc usevars : list uniq usevars if ("`usevars'`not'" == "") err 2000 cap `dreep' `usevars' _desc `"`using'"' `c(k)' `nv' restore ,not e 0 // done } * split varlist loc prt = ceil(`nv'/(c(maxvar) - 1)) loc sz = ceil(`nv'/`prt') loc f 1 loc t `sz' forv j = 1/`prt' { mata : st_local("varlist`j'", /* */ invtokens(tokens(st_local("varlist"))[(`f'..`t')])) loc f = `f' + `sz' loc t = cond(`j' == `prt' - 1, `nv', `t' + `sz') sret loc part`j' `varlist`j'' } sret loc parts = `prt' * select variables preserve forv j = 1/`prt' { qui u `varlist`j'' using `"`using'"' ,clear cap `cmd' ,`options' if _rc { cap noi `cmd' ,`options' e _rc } loc usevars `usevars' `r(varlist)' } loc usevars : list uniq usevars if ("`not'" != "") loc usevars : list varlist - usevars _desc `"`using'"' `: word count `usevars'' `nv' qui u `usevars' using `"`using'"' `in' ,clear `label' restore ,not end pr _desc di as txt _n "File: " as res `"`1'"' di as txt "vars: " _col(7) as res `2' "/" `3' if (`2' >= c(maxvar)) err 900 if !(`2') { di as err "no variables defined" e 111 } end e 1.0.2 22apr2012 may multiply "k" 1.0.1 23mar2012 "k" may be used in varspec 1.0.0 09feb2012 more efficient code (first in SSC) 1.0.0 06feb2012 beta