我有数千个城市文件夹(例如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
,而不是那些更深层次的。{/ p>
更具体地说,如果我想在所有家庭文件夹中采取行动,我需要什么样的工作流程?
我已经初步尝试编写代码来实现我的目标:
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''
在导演中,无论如何,我都努力使其无效。
我对这个项目有another post。
补充说明:
正如尼克指出的那样,这是导致麻烦的反斜杠。然而,从这一点开始,我遇到了另一个问题。说,没有复杂的操作,我只想测试我的循环是否有效,所以我写下面的代码片段:
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
答案 0 :(得分:3)
虽然不是您实际呈现的任何问题的解决方案,但更简单的方法可能是使用来自SSC(filelist
)的ssc install filelist
。
一个例子可能是:
. // list all files
. filelist, directory("D:\Datos\RFERRER\Desktop\example")
Number of files found = 5
.
. // strange way of tagging directories ending in "\house"
. // change at will
. gen tag = substr(reverse(dirname),1,6) == "esuoh/"
.
. order tag
. list
+----------------------------------------------------------------------------------------------+
| tag dirname filename fsize |
|----------------------------------------------------------------------------------------------|
1. | 0 D:\Datos\RFERRER\Desktop\example/proj_1 newfile.txt 0 |
2. | 1 D:\Datos\RFERRER\Desktop\example/proj_2/house somefile.txt 0 |
3. | 0 D:\Datos\RFERRER\Desktop\example/proj_3/subproj_3_2 newfile2.txt 0 |
4. | 1 D:\Datos\RFERRER\Desktop\example/proj_3/subproj_3_2/house anothernewfile.txt 0 |
5. | 1 D:\Datos\RFERRER\Desktop\example/proj_3/subproj_3_2/house someotherfile.txt 0 |
+----------------------------------------------------------------------------------------------+
然后,使用keep
或drop
,以变量tag
为条件。
图形上,目录如下所示:
(我在Stata 13上。检查help string functions
是否有其他标记方式。)
答案 1 :(得分:0)
您修改后的问题可能会产生
local folder: dir . dirs "*"
foreach i of local folder {
di "`i'"
local house : dir "G:\Data_backup\Soufang_data/`i'\house" files "*.xlsx"
foreach j of local house {
di "`j'"
}
}
但显然我们无法看到您的文件结构或文件名。