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.