Stata 解析目录中的所有文件夹

Stata 解析目录中的所有文件夹,stata,Stata,我和斯塔塔一起工作,是个初学者。我有一个关于获取文件夹名称的问题。我有一个目录,\Test\abc,其中包含以下类似的文件夹: Q100 Q101 Q102 .... 我想进入每个文件夹,Q*其中*表示Q之后的任何内容,找到一个名为filenameQ*的文件,执行一些操作,然后将输出发送回\Test\abc。下面的代码展示了我想要做的事情,其中varlist Q*表示目录中以Q开头的所有文件夹的数组。但是,文件夹名称不是变量,因此我不确定如何继续 cd "\\Test\abc" foreach

我和斯塔塔一起工作,是个初学者。我有一个关于获取文件夹名称的问题。我有一个目录,\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 ..
} 

有一个名为folders的用户编写的命令,它将文件夹的名称存储在本地rfolders中。还有另一个名为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 ..
    }   
}

有一个名为folders的用户编写的命令,它将文件夹的名称存储在本地rfolders中。还有另一个名为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 ..
    }   
}

Stata有一组用于宏的扩展函数。请参阅“帮助扩展功能”作为参考。其中一个扩展函数可以帮助您获取文件夹和文件的名称

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


我删除了cd部分,因为无论当前感兴趣的文件位于何处,通常最好保持相同的工作目录,以便指定相同的输出路径。

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

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


我删除了cd部分,因为无论当前感兴趣的文件位于何处,通常最好保持相同的工作目录,以便指定相同的输出路径。

文件夹和fs位于相同的软件包fs中,因此一次安装就足够了。谢谢!还有一个问题——假设Q*不符合顺序,我该如何对文件夹内容进行排序?@Justin folders和fs都按升序列出内容。您希望如何对这些文件进行排序?因此文件夹/文件具有以下后缀:Q[0-9]Year。年份必须按升序排列。因此,上面的代码对它们进行了排序,结果类似于Q11995、Q11996、Q1997,等等——相反,我希望Q11995、Q21995。。。Q91995,Q21996@Justin我编辑了代码以考虑排序约束。您应该编辑问题以包含关键信息。文件夹和fs位于同一个软件包fs中,因此一次安装就足够了。谢谢!还有一个问题——假设Q*不符合顺序,我该如何对文件夹内容进行排序?@Justin folders和fs都按升序列出内容。您希望如何对这些文件进行排序?因此文件夹/文件具有以下后缀:Q[0-9]Year。年份必须按升序排列。因此,上面的代码对它们进行了排序,结果类似于Q11995、Q11996、Q1997,等等——相反,我希望Q11995、Q21995。。。Q91995,Q21996@Justin我编辑了代码以考虑排序约束。您应该编辑问题以包含该关键信息。
<PATH1> 
local fileList : dir "<PATH2>" files "filenameQ*"
* 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
  }
}