0

我有数千个城市文件夹(例如city1,city2等,但实际上命名为NewYork,Boston等)。每个文件夹还包含两个子文件夹:landhouse.

所以目录结构是这样的:

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

似乎代码只在第一个城市上循环了一轮,但未能到达city2city3依此类推。我怀疑这是由于我在当地的写作有问题,尤其是在这一行,但我不确定:

foreach j of local `i'_house
4

2 回答 2

3

虽然不能解决您实际提出的任何问题,但更简单的方法可能是使用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 |
     +----------------------------------------------------------------------------------------------+

之后,使用keepor drop,以变量为条件tag

从图形上看,该目录如下所示:

在此处输入图像描述

(我在 Stata 13 上。检查help string functions其他标记方式。)

于 2016-02-22T16:45:30.077 回答
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'"
     }
}

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

于 2016-02-23T08:57:20.570 回答