Stata:目录和文件遍历的多种方式-rcd-filelist

发布时间:2023-06-23 阅读 2445

Stata连享会   主页 || 视频 || 推文 || 知乎 || Bilibili 站

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

New! lianxh 命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc, ihelp, rdbalance, gitee, installpkg

课程详情 https://gitee.com/lianxh/Course

课程主页 https://gitee.com/lianxh/Course

⛳ Stata 系列推文:

PDF下载 - 推文合集

张春雷 (东北财经大学),hzhchl@126.com
李丹华 (东北财经大学),2690337855@qq.com


目录


原始的数据资料通常包含多个年份,多个地区,多个指标等维度,统一维度的资料通常散存于不同的文档甚至不同的文件夹。在使用 Stata 进行数据处理的过程中,需要对目录中的资料进行批处理以提高工作效率,本文介绍了几种目录和文件遍历的方法以供参考。

1. 单个目录中的文件循环

在单个目录中且文件较少的情况下,使用 foreach 循环对多个文件进行批处理十分简单。

* 文件名较少的情况下
foreach f in file1 file2 file3{
  dis "`f'"
} //file1 file2 file3 为目录下的文件名 

2. 借助暂元对目录和文件进行循环

2.1 借助暂元对目录进行循环

当工作路径存在较多目录的情况下,要获取子目录的相关信息就需要对子目录进行循环。dir 命令能够列示出工作路径下的子目录和文件,通过与暂元组合,可以将提取到的目录信息存储至暂元。通过对暂元循环,可以对子目录进行查看和操作。

* 借助暂元对对目录进行循环
local dlist: dir "." dirs "*"  
foreach d of dlist{
    dis "`d'"
}
  • . 表示当前工作路径,也可自定义路径;
  • dirs 表明要提取的信息为目录列表;
  • * 任何类型的子目录。

2.2 借助暂元对文件进行循环

使用 dir 和暂元对工作路径下的文件进行循环时,只需要将上述命令中的 dirs 更改为 files 即可。

local flist : dir "." files "*" 
foreach f of local flist {
    dis "`f'"
}
  • . 表示当前工作路径,也可自定义路径;
  • files 表明要提取的信息为文件列表;
  • * 任何类型的文件,也可指定为符合条件的文件如 Excel 表格。

2.3 借助暂元对目录和文件嵌套循环

借助暂元对目录和文件嵌套循环能够对工作路径子目录下的文件进行循环,从而达到数据批处理的效果。

cd $path                                  //进入工作路径
local dlist: dir "." dirs "*"             //提取子目录列表
foreach f1 of local dlist{                //对子目录进行循环
    local temppath =  "$path"+"\"+"`f1'"  //组合子目录绝对路径
    cd `temppath'                         //进入子目录 
    local flist : dir "." files "*.xls"   //提取子目录的文件列表
    foreach f2 of local flist{            //对子目录文件列表进行循环
        import excel using "`f2'" , clear //导入文件
        save `f2'.dta , replace           //保存文件
    }
} 

如果需要将子目录下文件移动至工作路径外的某一文件夹以方便后续操作,则代码如下:

global path ""
global path0 ""

cd  $path                                        //一级目录
local dlist: dir "." dirs "*"
foreach f1 of local dlist{                       //提取子目录列表
    local temppath =  "$path"+"\"+"`f1'"         //组合子目录绝对路径
    cd `temppath'                                //进入子目录
    local flist : dir "." files "*20.xls.dta"    //提取子目录的文件列表
    foreach f2 of local flist{                   //对子目录文件列表进行循环
        local filename = "`temppath'"+"\"+"`f2'" //将目标文件存储到一个暂元中
        dis "`filename'"
        copy `filename'  $path0\                 //复制文件到$path0
    }
}

2.4 缺点

借助暂元对目录和文件嵌套循环代码较长,较难理解,且嵌套的过程容易出错。需要事先明确目录结构,每一层目录都要嵌套新的目录循环,对于未知结构的目录系统适用性较差。

3. 外部命令 rcd

3.1 rcd 命令介绍

rcd 命令提供了对目录便利的一种简便方法。

* 安装命令
ssc install rcd, replace
* 语法格式
rcd [directory_name], [verbose] [depth(integer >= 1)] 
    [dirfilter(regular expression)] [: command]
rcd   //遍历并列示当前目录和所有子目录,多级子目录
rcd . //遍历但不列示当前目录和所有子目录,多级子目录

forvalues i = 1(1)`r(tdirs)'{
    dir "`r(ndir`i')'`c(dirsep)'*dta"
}   //使用rcd命令遍历的目录储存在暂元中以供调用。
* 注: `c(dirsep)' = "/"

* 遍历目录并列示目录下的特定文件
rcd . : dir "*.xls"
rcd . : dir "*.dta"
rcd , dirfilter("[0-9]") : pwd  //筛选包含数字的目录并列示当前工作路径
rcd , dirfilter("上海") : pwd   //筛选包含“上海”二字的目录并列示当前工作路径

rcd, depth(#): pwd  
//depth() 定义了 rcd 遍历目录的层级,
//depth(1) 只遍历当前工作目录 (即结果包含当前工作目录) 
//depth(2) 遍历当前工作目录和子目录 (结果包含当前工作目录和子目录)  

3.2 使用 rcd 命令和暂元结合遍历文件

cd $path  //进入工作路径
rcd .     //遍历目录但不列示
forvalues i = 1(1)`r(tdirs)'{  //对目录进行循环
    cd "`r(ndir`i')'"          //进入遍历的目录
    * 提取文件信息并循环,保存至对应文件夹
    local flist: dir "." files "*.xls"  
    foreach f of local flist{
        dis "`f'"
        import excel using "`f'" , clear
        save `f'.dta , replace
    }
}

3.3 优缺点

使用 rcd 和暂元结合的方式不用事先知晓目录结构,且能够发现并对工作路径下的文件进行操作,大大拓展了其适用性。另一个好处是,rcd 能够定义检索的目录层级,这一特性使得该方法更具灵活性。

4. 外部命令 filelist

外部命令 filelist 用于遍历并列出指定文件夹下特定类型的文件数量和名称。对于此命令,连享会往期推文 Stata:遍历并列示文件夹下所有文件-filelist 已作过详细介绍,本文不再赘述。本章主要聚焦于如何将遍历的 Excel 文件导入 Stata 并保存到和 Excel 文件对应的目录中。

* 遍历文件,导入文件并保存到相应目录
filelist, list pattern("*.xls") save(mydata.dta)  
use mydata.dta, clear 
local obs = _N
forvalues i=1/`obs'{
    use mydata.dta in `i', clear      //导入数据mydata第`i'行
    local f = dirname + "/" + filename  
    local tempdirname = dirname[1]    //提取目录信息
    local tempfilename = filename[1]  //提取文件信息
    * dis "`tempdirname' "  " `tempfilename'"
    import excel using "`f'",  clear
    save  `tempdirname'/`tempfilename'.dta, replace  
}

filelis 能够直接对工作路径下的文件进行遍历并将文件的信息存储到一个 Stata 数据文件中,具有灵活复用的特点,适合复杂目录及文件系统的操作。

5. 总结

本文罗列了几种目录和文件系统遍历的方法,几种方法各有优缺点,需斟酌使用。在处理数据过程中选取合适的方法不仅能提高数据处理效率,也能保证数据处理的准确性。

6. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh 暂元 遍历, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

相关课程

免费公开课

最新课程-直播课

专题 嘉宾 直播/回看视频
最新专题 文本分析、机器学习、效率专题、生存分析等
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]
  • Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。

课程主页

课程主页

关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 连享会-主页知乎专栏,700+ 推文,实证分析不再抓狂。直播间 有很多视频课程,可以随时观看。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会-常见问题解答:
https://gitee.com/lianxh/Course/wikis

New! lianxhsongbl 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh