如何获得完整的子目录列表(包括子目录的子目录)?

时间:2016-02-22 16:23:14

标签: stata data-manipulation stata-macros

我有数千个城市文件夹(例如city1city2等,但实际上命名为NewYorkBoston等。每个文件夹还包含两个子文件夹:landhouse

所以目录结构如下:

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

似乎代码只在第一个城市循环一轮,但未能到city2city3等等。我怀疑是因为我对当地人的写作有问题,特别是在这一行,但我不确定:

foreach j of local `i'_house

2 个答案:

答案 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 |
     +----------------------------------------------------------------------------------------------+

然后,使用keepdrop,以变量tag为条件。

图形上,目录如下所示:

enter image description here

(我在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'"
     }
}

但显然我们无法看到您的文件结构或文件名。