Как токенизировать расширенный макрос (локальный: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,

Я не думаю, что какой-либо из этих подходов более эффективен, чем тот, который вы имеете в виду (работает быстрее, использует меньше памяти, короче или что-то "эффективное" означает для вас). Код явно предполагает, что вы правильно настроили список файлов.

Другие вопросы по тегам