Stata连享会 主页 || 视频 || 推文 || 知乎 || Bilibili 站
温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
New!
lianxh
命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc
,ihelp
,rdbalance
,gitee
,installpkg
⛳ Stata 系列推文:
张春雷 (东北财经大学),hzhchl@126.com
李丹华 (东北财经大学),2690337855@qq.com
目录
原始的数据资料通常包含多个年份,多个地区,多个指标等维度,统一维度的资料通常散存于不同的文档甚至不同的文件夹。在使用 Stata 进行数据处理的过程中,需要对目录中的资料进行批处理以提高工作效率,本文介绍了几种目录和文件遍历的方法以供参考。
在单个目录中且文件较少的情况下,使用 foreach
循环对多个文件进行批处理十分简单。
* 文件名较少的情况下
foreach f in file1 file2 file3{
dis "`f'"
} //file1 file2 file3 为目录下的文件名
当工作路径存在较多目录的情况下,要获取子目录的相关信息就需要对子目录进行循环。dir
命令能够列示出工作路径下的子目录和文件,通过与暂元组合,可以将提取到的目录信息存储至暂元。通过对暂元循环,可以对子目录进行查看和操作。
* 借助暂元对对目录进行循环
local dlist: dir "." dirs "*"
foreach d of dlist{
dis "`d'"
}
.
表示当前工作路径,也可自定义路径;dirs
表明要提取的信息为目录列表;*
任何类型的子目录。使用 dir
和暂元对工作路径下的文件进行循环时,只需要将上述命令中的 dirs
更改为 files
即可。
local flist : dir "." files "*"
foreach f of local flist {
dis "`f'"
}
.
表示当前工作路径,也可自定义路径;files
表明要提取的信息为文件列表;*
任何类型的文件,也可指定为符合条件的文件如 Excel 表格。借助暂元对目录和文件嵌套循环能够对工作路径子目录下的文件进行循环,从而达到数据批处理的效果。
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
}
}
借助暂元对目录和文件嵌套循环代码较长,较难理解,且嵌套的过程容易出错。需要事先明确目录结构,每一层目录都要嵌套新的目录循环,对于未知结构的目录系统适用性较差。
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) 遍历当前工作目录和子目录 (结果包含当前工作目录和子目录)
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
}
}
使用 rcd
和暂元结合的方式不用事先知晓目录结构,且能够发现并对工作路径下的文件进行操作,大大拓展了其适用性。另一个好处是,rcd
能够定义检索的目录层级,这一特性使得该方法更具灵活性。
外部命令 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 数据文件中,具有灵活复用的特点,适合复杂目录及文件系统的操作。
本文罗列了几种目录和文件系统遍历的方法,几种方法各有优缺点,需斟酌使用。在处理数据过程中选取合适的方法不仅能提高数据处理效率,也能保证数据处理的准确性。
Note:产生如下推文列表的 Stata 命令为:
lianxh 暂元 遍历, m
安装最新版lianxh
命令:
ssc install lianxh, replace
免费公开课
最新课程-直播课
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 | 文本分析、机器学习、效率专题、生存分析等 | |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
⛳ 课程主页
⛳ 课程主页
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会-常见问题解答:
✨ https://gitee.com/lianxh/Course/wikis
New!
lianxh
和songbl
命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh