macros stata tokenize

macros - Cómo tokenizar una macro extendida(local: dir) en stata?



tokenize (1)

Sé que mi título es confuso en el sentido de que el comando tokenize se especifica en la cadena.

Tengo muchas carpetas que contienen archivos de Excel masivos, separados y mal nombrados (la mayoría de ellos son extraídos de un sitio web). No es conveniente seleccionarlos manualmente, así que tengo que confiar en la función macro extendida de Stata local :dir para leerlos. Mi código es como

foreach file of local filelist { import excel "`file''", clear sxpose, clear save "`file''.dta", replace }

Dicho código generará muchos archivos .dta nuevos y, por lo tanto, el directorio estará lleno de estos archivos. Prefiero crear un único archivo de datos nuevo para el primer archivo .xlsx y append otros dentro del bucle foreach . Entonces, esencialmente, hay un if-else dentro del ciclo. Necesitamos un índice de la lista de filelist macro recién creada, para que podamos escribir algo así como

token `filelist'' // filelist is created in the former code if "`i''" == `1'' { import excel "`file''",clear } else { append using `i'',clear }

Sé que mi código es ineficiente y propenso a errores: la sintaxis del token ''filelist'' de expresión token ''filelist'' es incorrecta (dado que filelist no es una cadena). Pero todavía quiero descubrir la estructura básica detrás de mi pseudo código. ¿Cómo podría corregir mi código y hacerlo funcionar? Otro enfoque más eficiente es muy bienvenido.


Varias técnicas vienen a la mente, ninguna de las cuales implica tokenización.

local count = 1 foreach file of local filelist { import excel "`file''",clear sxpose, clear if `count'' == 1 save alldata else append using alldata local ++count } local allothers "*" foreach file of local filelist { import excel "`file''",clear sxpose, clear `firstonly'' save alldata `allothers'' append using alldata local firstonly "*" local allothers }

En el segundo bloque, el punto es que las líneas con prefijo * se tratan como comentarios, por lo que cualquier comando que * preceda se ignorará ("comentario"). La declaración de append se comenta la primera vez en el ciclo y la instrucción de save va precedida de una macro local no definida, que se evalúa como una cadena vacía, por lo que no se ignora.

Después de la primera vez en el ciclo, se elimina el comentario de append , pero se coloca en el save .

No creo que ninguno de estos enfoques sea más eficiente que lo que tienes en mente (funciona más rápido, usa menos memoria, es más corto o lo que sea "eficiente" para ti). El código claramente presupone que ha configurado correctamente la lista de archivos.