Stata:为无规则命名的文件批量创建同名文件夹

发布时间:2020-10-25 阅读 3542

Stata 连享会   主页 || 视频 || 推文

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

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

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

作者: 徐云娇 (厦门大学)
邮箱: jilyo@stu.xmu.edu.cn


目录


1. 问题背景

一场新冠肺炎疫情,改变了传统的线下考试模式,很多学校期末考试的收卷、改卷、归档已经全面实现了无纸化。线上考试尽管可以跨越空间的约束解决学校的燃眉之急,但后期助教们在对学生 PDF 试卷进行建档的时候,大多工作都是一些重复劳动,于是我们便想利用 Stata 实现一些优化。

原始答卷是学生以 “姓名+学号” 作为命名的分录题作答的 PDF 文档,以及以 “姓名” 作为命名的选择题答题结果的 PDF 文档,如图:

学院对学生试卷建档的具体要求是:

  • 为班级中每个同学建立专属的文件夹,命名规则为:姓名+学号;

  • 将每个学生选择题和分录题的两份 PDF 放入他们对应的文件夹内。

2. 问题难点

  • 学生的 “姓名+学号” 既包含不同的字符又包含不连续的数字,因此在创建以此命名的文件夹时, forvalue 的循环语句失效;
  • 利用 dir 命令批量提取 PDF 文档文件名称时,文件名称中的空格也将被保留下来,且文件名的后缀名也无法去除;
  • 如何批量创建无规则命名的文件夹,并将每个学生的答卷移入其对应的文件夹中。

3. 解决方案

4. 命令解析

以下是解决上述问题的 Stata 程序:

clear
cd C:\Users\jilyo\Desktop\分录题
local file1: dir "\Users\jilyo\Desktop\分录题" files "*.pdf" //读取分录题文件夹中 PDF 的文件名
dis `file1'
foreach file in `file1'{
   local file2 = subinstr("`file'",".pdf","",.) //去掉文件名后缀.pdf
   local file3 = subinstr("`file2'"," ","",.)   //去掉文件名中的空格
   local files "`files' `file3'"                //将全部处理过的文件名存在一个暂元中
 }
dis "`files'"

foreach file in `files'{
  local subname = substr("`file'",1,6)        //提取每个文件名前两个中文字符,后续匹配之用
  dis "`subname'"          
  mvfiles, infolder(".") outfolder(./`file')  ///
            match(`subname'*) makedirs erase  //为每一个 PDF 建立一个同名文件夹,并且将分录题 PDF 放入文件夹中
  mvfiles, infolder("\Users\jilyo\Desktop\选择题") outfolder(./`file')  ///
            match(`subname'*)  erase          //将选择题 PDF 放入文件夹中
}

以上命令解决问题的步骤如下:

  1. 利用 dir 命令批量提取存放于电脑桌面的 “期末考试” 这一文件夹中所有 .pdf 格式文件的文件名称,并将其存放于 file1 这个暂元中;

file1 暂元中存放的文件名中含有文档的后缀名 .pdf,这会导致后续使用 mvfiles 命令批量创建的文件夹名称中也含有 .pdf 字样,不美观且不符合学院要求。

  1. 利用 subinstr 命令去除 file1 文件名的后缀名,并将结果存放于 file2 暂元中;

暂元 file2 中存放的单个文件名中存在空格,在没有 .pdf 后缀的情况下,如果保留空格,则会导致后面的 foreach 循环语句识别混乱,比如 “张三 12345” 经过循环之后会创建出 “张三” 和 “12345” 两个文件夹。

  1. 按照同样的思路,利用 subinstr 命令去除 file2 文件名中的空格,并存放于file3 暂元中;

  2. 将每次循环的结果保存在 files 暂元中;

  1. 结合 foreach 以及 mvfiles 命令批量创建以暂元 files 中元素命名的文件夹,即以学生 “姓名+学号” 命名的文件夹;

部分 PDF 答卷命名中包含空格,所以在匹配 PDF 文件并将其拖入对应名称的文件夹过程中出现困难,比如学生将其 PDF 答卷命名为 “张三 12345” (含有空格),但 mvfiles 命令在匹配时寻找的是“张三12345” (不含空格),所以张三同学的答卷便未能被拖入以 “张三12345” 命名的文件夹内;

  1. 利用 substr 命令提取暂元 files 中元素的前 6 个字符,比如 “张三12345” 将被提取 “张三” 这两个中文,将提取结果存放于 subname 暂元中;

  2. 最后, mvfiles 命令会将 “分录题” 和 “选择题” 文件夹中含有 “张三” 字段的 PDF 文件放置于以 “张三12345” 命名的文件夹中,并删除原始的 PDF 文件。

5. 处理效果

处理之后为每个学生新建了一个文件夹,命名规则是 “姓名+学号”。

每一个文件夹打开都是对应学生分录题和选择题的答卷。

6. 结语

  • 应用场景拓展:此批量整理 PDF 文档的方法同样适用于文献管理,假如下载了一批文献之后想为这些文献创建同名文件夹,日后存放文章的代码或者学习笔记等,那么便可利用此方法快速创建。

  • 关于推文涉及命令更详细的语法帮助,可在 Stata 中键入:

  • help mvfiles

  • help macro

  • help extended_fcn

  • help rcd // 自循环,外部命令

  • help uall // adoedit uall.ado 可以查看内部语句

参考资料和扩展阅读

相关课程

连享会-直播课 上线了!
http://lianxh.duanshu.com

免费公开课:


课程一览

支持回看,所有课程可以随时购买观看。

专题 嘉宾 直播/回看视频
最新专题 DSGE, 因果推断, 空间计量等
Stata数据清洗 游万海 直播, 2 小时,已上线
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]

Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。


关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。直播间 有很多视频课程,可以随时观看。
  • 连享会-主页知乎专栏,300+ 推文,实证分析不再抓狂。
  • 公众号推文分类: 计量专题 | 分类推文 | 资源工具。推文分成 内生性 | 空间计量 | 时序面板 | 结果输出 | 交乘调节 五类,主流方法介绍一目了然:DID, RDD, IV, GMM, FE, Probit 等。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会主页  lianxh.cn
连享会主页 lianxh.cn

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

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

✏ 连享会学习群-常见问题解答汇总:
https://gitee.com/arlionn/WD