我正在与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 ..
}
答案 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
部分,因为通常最好保留相同的工作目录,以便指定相同的输出路径,而不管当前感兴趣的文件的位置。