我有数千个城市文件夹(例如city1
, city2
等等,但实际上命名为NewYork
, Boston
, ETC。)。每个文件夹还包含两个子文件夹:land
and 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''
无论如何,在目录中,我努力让它工作但没有成功。
I have 另一个帖子 https://stackoverflow.com/questions/34872508/how-to-tokenize-a-extended-macro-local-dir-in-stata/34875242?noredirect=1#comment57574055_34875242在这个项目上。
补充说明:
正如尼克所指出的,正是反斜杠造成了麻烦。然而,从这一点来看,我遇到了另一个问题。比如说,没有复杂的操作,我只想测试我的循环是否有效,所以我编写了以下代码片段:
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