如何获取子目录的完整列表(包括子目录的子目录)?
How to acquire complete list of subdirs (including subdirs of subdirs)?
我有数千个城市文件夹(例如city1
、city2
等,但实际上命名为NewYork
、Boston
等) .每个文件夹还包含两个子文件夹:land
和 house
。
所以目录结构是这样的:
current dictionary
---- city1
----- house
------ many .xlsx files
----- land
----- city2
----- city3
···
----- city1000
我想获取所有子目录的完整列表并进行一些操作(如 import excel
)。我知道有一个宏扩展函数:local list: dir
来处理这个问题,但它似乎只能 return 子目录的 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''
在目录中,无论如何我都努力让它工作但没有成功。
我在这个项目上 。
补充说明:
正如 Nick 指出的那样,问题出在反斜杠上。然而,从这一点出发,我遇到了另一个问题。说,没有复杂的动作,我只是想测试我的循环是否有效,所以我写了下面的代码片段:
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
虽然不是解决您实际提出的任何问题的方法,但更简单的方法可能是使用来自 SSC (ssc install filelist
) 的 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
了解其他标记方法。)
你修改后的问题可能会变成
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'"
}
}
但显然我们看不到您的文件结构或文件名。
我有数千个城市文件夹(例如city1
、city2
等,但实际上命名为NewYork
、Boston
等) .每个文件夹还包含两个子文件夹:land
和 house
。
所以目录结构是这样的:
current dictionary
---- city1
----- house
------ many .xlsx files
----- land
----- city2
----- city3
···
----- city1000
我想获取所有子目录的完整列表并进行一些操作(如 import excel
)。我知道有一个宏扩展函数:local list: dir
来处理这个问题,但它似乎只能 return 子目录的 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''
在目录中,无论如何我都努力让它工作但没有成功。
我在这个项目上
补充说明:
正如 Nick 指出的那样,问题出在反斜杠上。然而,从这一点出发,我遇到了另一个问题。说,没有复杂的动作,我只是想测试我的循环是否有效,所以我写了下面的代码片段:
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
虽然不是解决您实际提出的任何问题的方法,但更简单的方法可能是使用来自 SSC (ssc install filelist
) 的 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
了解其他标记方法。)
你修改后的问题可能会变成
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'"
}
}
但显然我们看不到您的文件结构或文件名。