查看原文
其他

筛选文件利器——filesearch命令

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:张   宇

本文编辑:田志凡

技术总编:司海涛

直播课程

第三次更新

为了感谢广大粉丝一直以来对爬虫俱乐部的厚爱与支持,爬虫俱乐部每周定期更新腾讯课堂的网络直播课程《精通stata之数据整理》,第三次更新的直播时间为12月22日明天19:30-21:00,直播内容为Stata绘图,已购买课程的老用户无需再次付费可直接观看,新用户购买后不仅可以观看更新内容,还可以观看以前的课程。

观看学习网址:https://ke.qq.com/course/286526?tuin=1b60b462,各位小伙伴们不要错过~

爬虫俱乐部将于2019年1月19日至25日在武汉举行两期Stata编程技术定制培训,此次采取初级班和高级班分批次培训模式,采用理论与案例相结合的方式,旨在帮助大家熟悉Stata核心的爬虫技术,以及Stata与其他软件交互的高端技术。详细培训大纲及报名方式,请见往期推文《2019寒假Stata编程技术定制培训班》。报名表下载请点击文末阅读原文呦~

我们在进行数据处理时,经常需要对某一路径下的文件或文件夹进行循环操作,常用的方法是通过宏扩展函数或fs命令将文件或文件夹的名称放入局部宏或返回值中,并结合foreach循环进行批量操作。但是这两个方法都有一个明显的缺陷——不能搭配正则表达式使用。而filesearch命令可以使用正则表达式,对文件名符合某一特征的文件进行批量操作,它是筛选文件或文件夹名称的利器。该命令为外部命令,使用“ssc install filesearch”进行安装。

一、filesearch的语法结构

filesearch [[`]"]pattern["[']] [, options]

filesearch命令具有比较丰富的选项,下面列出了几个常用选项以及它们的作用:

(1)subdirectories:搜索文件夹名,不指定该选项,默认搜索文件名;

(2)recursive:递归搜索,如果指定该选项,则会遍历指定路径中的所有子文件或子文件夹;

(3)regexpression:匹配模式将被识别为正则表达式;

(4)strip:删除检索结果中符合匹配模式的部分;

(5)local(macname):定义局部宏的名称,同时filesearch命令不产生返回值;

(6)fullpath:返回检索到的文件或文件夹的绝对路径,默认返回相对路径;

(7)directory(directory):指定搜索路径。

二、例子说明

在“E:\”根目录下构造一个名为filesearch的文件夹,其中有若干个子文件夹、文本文档以及dta文件,并且在两个子文件夹filesearch1、filesearch2中又分别有若干个子文件和子文件夹。如下图所示:

1.利用正则表达式精确筛选文件

       对于上述文件,假设我们想检索到文件名为爬虫俱乐部右边有1个字符并且该字符为英文字母的所有dta文件,即爬虫俱乐部a.dta、爬虫俱乐部b.dta,使用通配符是无法解决的。filesearch命令指定选项regex即可使用正则表达式,相应程序如下:

clear cd  E:\filesearch filesearch "爬虫俱乐部[a-z].dta" , regex

结果如下:

上述程序中,指定了regex选项,因此匹配模式将被识别为正则表达式,同时在没有指定subdir选项的情况下,检索的是能够匹配到正则表达式“爬虫俱乐部[a-z].dta”的文件名,这里“[a-z]”用来匹配任意一个小写英文字母,所以检索结果为“爬虫俱乐部a.dta”、“爬虫俱乐部b.dta”。另外,检索到的文件名被保存

在“r(filenames)”这个返回值中,我们可以利用该返回值对文件名进行循环。

return list

结果如下:

       当然,如果我们想要检索到以日期格式命名的所有txt文件。例如“2018-01-01.txt”,最直观的做法是写出正则表达式“\d+-\d+-\d+.txt”来匹配日期。但是此时 “1-1-1.txt”、“2-2-2.txt”等也将被匹配上,为了更加准确的匹配到以日期命名的文件,我们可以将正则表达式改为“\d{4}-\d{2}-\d{2}.txt”,通过使用数量元字符“{n}”,限定了年月日中数字的匹配次数,从而精确地筛选到目标文件。程序如下:

filesearch  "\d{4}-\d{2}-\d{2}.txt" , regex

结果如下:

2.检索缺省路径下的文件夹

如果我们仅仅想要检索某个路径下的文件夹,可以指定subdir选项:

filesearch *, subdir

结果如下:

如上图所示,使用通配符“*”并指定subdir选项,我们得到了“E:\filesearch\”路径下所有的文件夹的名称,即“filesearch1”、“filesearch2”。

3.递归搜索

recursive选项可以使搜索遍历指定路径中所有的子文件或子文件夹。例如,我们遍历“E:\filesearch\”路径下所有的txt文件。程序如下:

filesearch *.txt, r

结果如下:

如上所示,通过指定选项r(recursive的简写),此次搜索遍历了“E:\filesearch\”路径下所有的子文件或子文件夹。由于在子文件夹filesearch1中也存在txt文件,因此也被筛选了出来。

4.定义局部宏

local()选项可以帮助我们定义局部宏的名称,同时filesearch命令不产生返回值,也就是说,检索结果会保存在我们定义的局部宏中,而不是在“r(filenames)”中。

clear all filesearch *.dta , local(stataclub) dis `stataclub'

结果如下:

可以看到,缺省路径下所有dta文件的文件名全部保存在名为“stataclub”的局部宏里面。

return list

如上所示,此时filesearch命令并没有产生返回值。使用返回值最大的问题就是当程序中有多个命令存在返回值时,前面命令的返回值会被后面命令的返回值“挤掉”,而不能反复使用。因此,建议在使用filesearch时用local()选项定义局部宏的名称。

5.删除文件后缀名

       我们在整理国泰安数据时,第一步往往是将Excel文件批量读入Stata中并保存为dta文件,程序如下:

clear fs *.xls foreach file in `r(files)' {   import excel using `file', first case(lower) clear   save `file'.dta,replace }

运行结果如上图所示,被保存下来的dta文件的后缀为“.xls.dta”。filesearch命令的strip选项可以删除检索结果中符合匹配模式的部分,利用该选项可以很好地解决这个问题,注意使用strip选项时,必须指定regex选项。程序如下:

clear filesearch  \.xls$, strip regex foreach file in `r(filenames)' {   import excel using `file'.xls, first case(lower) clear   save `file'.dta,replace }

如上图所示,此时保存下来的dta文件不存在原来Excel的后缀“.xls”。其中,选项regex使匹配模式“\.xls$”被识别为正则表达式,其可以匹配到“.xls”格式的文件;strip选项使得返回的结果中删除了匹配模式锁定的内容,即字符串“.xls” 。

       以上就是对filesearch命令的简单介绍,这么好用的命令大家快用起来吧!

有问题,不要怕!访问 

http://www.wuhanstring.com/uploads/5_aboutus/爬虫俱乐部-用户问题登记表.docx (复制到浏览器中)下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~

爬虫俱乐部的github主站正式上线了!我们的网站地址是:https://stata-club.github.io,粉丝们可以通过该网站访问过去的推文哟~

爬虫俱乐部隆重推出数据定制及处理业务,您有任何网页数据获取及处理方面的难题,请发邮件至我们邮箱statatraining@163.com,届时会有俱乐部高级会员为您排忧解难!

对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!

往期推文推荐

关于我们

微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。


此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。

投稿邮箱:statatraining@163.com

投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。



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

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