解析目录

时间:2016-06-15 21:11:20

标签: stata

我正在与Stata合作并且是初学者。我有一个关于抓取文件夹名称的问题。我有一个目录,\ Test \ abc,它有如下文件夹:

Q100
Q101
Q102
....

我想进入每个文件夹,Q *(其中*表示Q之后的任何内容),找到一个名为“filenameQ *”的文件,做一些事情,然后将输出发送回\ Test \ abc。下面的代码显示了我想要做的事情,其中​​varlist Q *表示目录中以Q开头的所有文件夹的数组。但是,文件夹名称不是变量,所以我不知道如何继续

cd "\\Test\abc"
foreach x of varlist Q* /* FOLDER NAMES */ { 
    cd "`x'"
    use "filename`x'" 
    display something and send it back to directory "\\Test\abc"
    cd ..
} 

2 个答案:

答案 0 :(得分:4)

有一个名为folders的用户编写命令,用于存储本地r(文件夹)中文件夹的名称。另一个名为fs的命令对文件执行相同操作。

以下是一个如何执行此操作的示例(根据注释中的排序约束):

capture ssc install fs, replace
cd "~/Desktop/Test/abc"

/* Get a list of years to loop over by stripping out Q[0-9] stubs, quotes, and de-dupeing */
folders Q*
local years=ustrregexra(`"`=ustrregexra(`"`r(folders)'"',"Q[0-9]","")'"',`"""',"")
local years: list uniq years

foreach y of local years {
    folders Q?`y'

    foreach d in `r(folders)' {
    cd "`d'"
    fs filename*
        foreach f in `r(files)' {
            ls `f'
        }
    cd ..
    }   
}

答案 1 :(得分:2)

Stata有一组扩展的宏功能。请参阅help extended_fcn作为参考。其中一个扩展功能可帮助您获取文件夹和文件的名称。

要获取存储在名为folderList的本地宏中的文件夹列表,请使用

local folderList : dir "<PATH1>" dirs "Q*"

其中

<PATH1> 

是包含感兴趣文件夹的文件夹的路径。您可以使用

类似地在文件夹中提取文件名
local fileList : dir "<PATH2>" files "filenameQ*"

以下是使用两个foreach循环的基本概念:

* get the list of folders
local path1 <PATH1>
local folderList : dir "`path1'" dirs "Q*"

* loop through folders
foreach folder of local folderList {
  * get list of files
  local fileList : dir "`path1'/`folder'" files "filenameQ*"

  * loop through files
  foreach file of local fileList {
    * do stuff to file
    use `file'
    ** do more stuff
  }
}

我删除了cd部分,因为通常最好保留相同的工作目录,以便指定相同的输出路径,而不管当前感兴趣的文件的位置。