Как токенизировать расширенный макрос (локальный:dir)?
Я знаю, что мое название сбивает с толку в том смысле, что tokenize
Команда указана для строки.
У меня есть много папок, которые содержат массивные, отдельные, плохо названные файлы Excel (большинство из них скопированы с веб-сайта). Их неудобно выбирать вручную, поэтому мне нужно полагаться на расширенную макро-функцию Stata. local :dir
читать их.
Мой код выглядит следующим образом:
foreach file of local filelist {
import excel "`file'", clear
sxpose, clear
save "`file'.dta", replace
}
Такой код будет генерировать много нового dta
файлы и каталог, таким образом, полон этих файлов. Я предпочитаю создать один новый файл данных для первого xlsx
файл, а затем append
другие к нему внутри foreach
петля. Так по сути, есть if-else
внутри петли.
Нам нужен индекс макроса filelist
только что создали, так что мы можем написать что-то вроде:
token `filelist' // filelist is created in the former code
if "`i'" == `1' {
import excel "`file'",clear
}
else {
append using `i',clear
}
Я знаю, что мой код неэффективен и подвержен ошибкам: синтаксис выражения token 'filelist'
тоже неверно (учитывая, что filelist
это не строка). Тем не менее, я все еще хочу выяснить базовую структуру моего псевдокода.
Как я могу исправить свой код и заставить его работать?
Другой более эффективный подход приветствуется.
1 ответ
На ум приходят различные техники, ни одна из которых не влечет за собой токенизацию.
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
}
Во втором блоке смысл в том, что строки с префиксом *
обрабатываются как комментарии, поэтому любая команда, которая *
предыдущий игнорируется ("закомментировано"). append
заявление закомментировано в первый раз вокруг цикла и save
Оператору предшествует неопределенный локальный макрос, который оценивается как пустая строка, поэтому он не игнорируется.
После первого раунда, комментируя append
удаляется, но помещается на save
,
Я не думаю, что какой-либо из этих подходов более эффективен, чем тот, который вы имеете в виду (работает быстрее, использует меньше памяти, короче или что-то "эффективное" означает для вас). Код явно предполагает, что вы правильно настроили список файлов.