查看原文
其他

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

连享会 连享会 2023-10-24

👇 连享会 · 推文导航 | www.lianxh.cn

连享会课程 · 2023 暑期班

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

温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」。或直接长按/扫描如下二维码,直达原文:


目录

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

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

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

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

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

    • 2.4 缺点

  • 3. 外部命令 rcd

    • 3.1 rcd 命令介绍

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

    • 3.3 优缺点

  • 4. 外部命令 filelist

  • 5. 总结

  • 6. 相关推文



原始的数据资料通常包含多个年份,多个地区,多个指标等维度,统一维度的资料通常散存于不同的文档甚至不同的文件夹。在使用 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

  • 专题:Stata教程
    • Stata编程:暂元,local!暂元,local!
  • 专题:Stata命令
    • Stata编程:暂元local和global的使用技巧
    • Stata:遍历并列示文件夹下所有文件-filelist
  • 专题:Stata绘图
    • Stata绘图:用暂元统一改变图形中的字号
  • 专题:Stata程序
    • Stata小白编程:暂元及macrolists命令
    • Stata程序:暂元-(local)-和全局暂元-(global)

课程推荐:深度因果推断(2023年8月2-5日)
主讲老师:江艇
课程地点:西安·西北工业大学
🍓 课程主页https://www.lianxh.cn/news/835167275c3af.html

New! Stata 搜索神器:lianxhsongbl  GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
. ssc install lianxh
. ssc install songbl
👉  使用:
. lianxh DID 倍分法
. songbl all

🍏 关于我们

  • 连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 直通车: 👉【百度一下: 连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存