У меня есть тысячи папок городов (например, city1
, city2
и т. д., но на самом деле они называются NewYork
, Boston
и т. д.). Каждая папка также содержит две подпапки: land
и house
.
Таким образом, структура каталогов выглядит так:
current dictionary
---- city1
----- house
------ many .xlsx files
----- land
----- city2
----- city3
···
----- city1000
Я хочу получить полный список всех подкаталогов и выполнить некоторые манипуляции (например, import excel
). Я знаю, что есть расширенная функция макроса: local list: dir
для решения этой проблемы, но кажется, что она может возвращать только first tier
подкаталогов, например city_i
, а не более глубокие.
В частности, если я хочу действовать во всех домашних папках, какой рабочий процесс мне нужен?
Я сделал первоначальную попытку написать код для достижения своей цели:
cd G:\Data_backup\Soufang_data
local folder: dir . dirs "*"
foreach i of local folder {
local `i'_house : dir "G:\Data_backup\Soufang_data\``i''\house" files "*.xlsx"
local count = 1
foreach j of local `i'_house {
cap import excel "`j'",clear
cap sxpose,clear
cap drop in 1/1
if `count'==1 {
save `i'.dta, replace
}
else {
cap qui append using `i'
save `i'.dta,replace
}
local ++count
}
}
Что-то не так с:
``i''
в каталоге я все равно безуспешно пытался заставить его работать.
У меня есть другой пост в этом проекте.
Дополнительные примечания:
Как указывает Ник, проблемы вызывает обратная косая черта. Однако, двигаясь с этой точки, я сталкиваюсь с другой проблемой. Скажем, без сложных действий, я просто хочу проверить, работают ли мои циклы, поэтому я пишу следующий фрагмент кода:
set more off
cd G:\Data_backup\Soufang_data
local folder: dir . dirs "*"
foreach i of local folder {
di "`i'"
local `i'_house : dir "G:\Data_backup\Soufang_data/`i'\house" files "*.xlsx"
foreach j of local `i'_house {
di "`j'"
}
}
Однако результат на экране выглядит примерно так:
city1
project100
project99
······
project1
Похоже, что код зацикливается только на один цикл по первому городу, но не достигает city2
, city3
и так далее. Я подозреваю, что это из-за моего проблематичного написания местного, особенно в этой строке, но я не уверен:
foreach j of local `i'_house
folder
содержат встроенные пробелы, они не подходят для использования в качестве имен макросов. - person Nick Cox   schedule 23.02.2016