Как получить полный список подкаталогов (включая подкаталоги подкаталогов)?
У меня тысячи городских папок (например 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
2 ответа
Хотя это не решение какой-либо проблемы, которую вы на самом деле представляете, более простым способом может быть использование filelist
от SSC (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
для других способов пометить.)
Ваша исправленная проблема может привести к
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'"
}
}
но ясно, что мы не можем видеть вашу файловую структуру или имена файлов.