Как получить полный список подкаталогов (включая подкаталоги подкаталогов)?

У меня тысячи городских папок (например 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'"
     }
}

но ясно, что мы не можем видеть вашу файловую структуру или имена файлов.

Другие вопросы по тегам