//////////////////////////////////////////////////////////////////////////////// // DOPARSER v 0.12.04 (5 de abril de 2012) // George Vega Yon (Superintendencia de Pensiones) // Programa que, en base a expresiones regulares, analiza dofiles linea a linea // y arroja como resultado una lista en pantalla con los DTA, su ubicacion fisica // (y en el codigo) //////////////////////////////////////////////////////////////////////////////// cap program drop doparser program doparser vers 10 syntax anything(name=archivo) [, Type(string) Export(string)] if length("`keep'") == 0 preserve clear quietly { // Lee el dofile doread "`archivo'" // Define ubicacion gen str244 location = "" local N = _N forval i = 1/`N' { local test regexm(lineas[`i'] , "^(cd )(.*)") if `test' { local l = regexr(lineas[`i'] , "^(cd )", "") } replace location = `"`l'"' if _n == `i' } // Analiza las lineas en busqueda de DTA files gen elemento = regexs(4) if regexm(lineas, "^((sysu|webu|mer|sa|ap|u)[a-z]*)(.* using )?(.*)") // Reemplazos replace elemento = regexr(elemento, ",.*| (in|if) .*", "") replace elemento = subinstr(elemento, `"""' , "", .) // Generando tipo y archivo gen type = regexs(1) if regexm(lineas, "^((sysu|webu|mer|sa|ap|u)[a-z]*)([ ]*[:alnum:]*[ ]*)(using)*([ ]*)([:graph:]*)([ ]*)((in|if).*)*") gen file = regexr(elemento, "^.*(/|\\)", "") // Reemplazos replace location = subinstr(elemento, file, "",.) if regexm(elemento, "\\|/") replace location = "(current do-file dir)" if length(location) == 0 // Se queda solo con lo que tiene registro keep if length(elemento) > 0 & length(type) > 0 // Filtra si el usuario lo pide asi if length("`type'") != 0 keep if type == "`type'" compress } list fil typ nl loc if length("`export'") != 0 save "`export'", replace qui restore end cap program drop doread program doread // Lee dofiles/adofiles (o cualquiera que se le impute) y lo importa linea por // linea a Stata args archivo cap file close archivo quietly { file open archivo using "`archivo'", r text file read archivo linea // Genera variable lineas donde se escribira cada lineas gen str244 lineas = "" // Lee la primera linea y la guarda en la variable lineas file read archivo linea replace lineas = `"`macval(linea)'"' // Lee el resto de las lineas y cierra la conexion while r(eof)==0 { local nobs = _N + 1 set obs `nobs' file read archivo linea replace lineas = `"`macval(linea)'"' if _n == _N } file close archivo doclean } end cap program drop doclean program doclean // para luego eliminar tabulaciones y fusionar lineas partidas (///, // /* */, ;) quietly { // Arregla las lineas que contienen tabulacion gen nline = _n + 2 replace lineas = regexr(lineas,char(9)," ") replace lineas = regexr(lineas,char(9)," ") replace lineas = regexr(lineas,char(9)," ") replace lineas = trim(lineas) // En el caso de que existan lineas particionadas por /// o ; local N = _N forval i = 1/`N' { local test = regexm(lineas[`i'], "[ ]///[ ]*.*$") local rep = 1 while `test' { replace lineas = regexr(lineas, "[ ]///[ ]*.*$", "") if _n == `i' replace lineas = lineas[`i']+" "+lineas[`i' + 1] if _n == `i' drop if _n == `i' + 1 local ++rep local test = regexm(lineas[`i'], "[ ]///[ ]*.*$") & !(`rep' >= `N') } } // En el caso de que existan lineas particionadas por /* en una linea */ local N = _N forval i = 1/`N' { local test = regexm(lineas[`i'], "/\*.*$") & regexm(lineas[`i' + 1], "\*/.*$") local rep = 1 while `test' { replace lineas = regexr(lineas, "/\*.*$", "") if _n == `i' replace lineas = regexr(lineas, "^\*/", "") if _n == (`i' + 1) replace lineas = lineas[`i']+" "+lineas[`i' + 1] if _n == `i' drop if _n == `i' + 1 local ++rep local test = regexm(lineas[`i'], "/\*.*$") & regexm(lineas[`i' + 1], "\*/.*$") & !(`rep' == `N') } } // En el caso de que existan lineas particionadas por /* varias */ local N = _N forval i = 1/`N' { local test = !(regexm(lineas[`i'], "/\*.*$") & !regexm(lineas[`i' + 1], "\*/.*$")) replace lineas = regexr(lineas, "/\*.*$", "") if _n == `i' local rep = 0 while !`test' { local ++rep if !`test' replace lineas = regexr(lineas, "^\*/", "") if _n == (`i' + 1) if !`test' replace lineas = lineas[`i']+" "+lineas[`i' + 1] if _n == `i' local test = !regexm(lineas[`i' + 1], "\*/.*$") | `rep' == `N' drop if _n == `i' + 1 } } } end /* // ejemplos doparser I:\eugenio\invalidez\codigo\pmutuales.do doparser I:\modelo_proyeccion_sc\programas\modulo_ma\06_checkea_piden.do doparser T:/bases/bdsc/muestra_sc/crea_muestras/2_a_muestra_redondeo.do doparser T:\bases\bdsc\muestra_sc\crea_muestras\1_c_muestra_renta_tope.do doparser T:/bases/bdsc/muestra_sc/crea_muestras/1_a_crea_base_muestra.do doparser T:/bases/bdsc/muestra_sc/crea_muestras/1_b_muestra_giro_tope.do doparser T:/bases/bdsc/muestra_sc/crea_muestras/1_c_muestra_renta_tope.do doparser T:/bases/bdsc/muestra_sc/crea_muestras/2_a_muestra_redondeo.do doparser T:/bases/bdsc/muestra_sc/crea_muestras/2_b_muestra_detalles_finales.do doparser T:/bases/bdsc/muestra_sc/crea_muestras/2_c_largos_registros.do doparser T:/bases/bdsc/muestra_sc/crea_muestras/3_muestras_a_informatica.do cd I:\modelo_proyeccion_sc\programas\modulo_ma\programas doparser 0_distribucion_rama.do , e(resultados) doparser 0_renta_afil_a.do , e(resultados) doparser 0_renta_afil_b.do , e(resultados) doparser 1_cotizantes.do , e(resultados) doparser 2_ingresos.do , e(resultados) doparser 3_saldos.do , e(resultados) doparser 4_tasa.do , e(resultados) doparser 5_probabilidades_a.do , e(resultados) doparser 5_probabilidades_b.do , e(resultados) cd I:\modelo_proyeccion_sc\programas\modulo_ma\ doparser config_modulo_ma.do doparser 00_simulacion.do doparser 01_tasas_de_crecimiento.do doparser 02_probabilidades_y_pondedadores.do, t(merge) doparser 03_tasas_de_extraccion.do doparser 04_genera_matrices.do */