三招而立——local命令的三秘技之删除特定文件

2016-10-04 徐鑫 爬虫俱乐部 爬虫俱乐部

当当当当~~诸君期待已久的local命令的第三秘技——利用 dir()函数删除目录下某一特征的全部文件,今天终于发出了,诸君快拿好小本本,见证自己的成神之路。这 个用法来自于作者真实碰到的问题,很多人可能会想作者一样使用网盘,dropbox也好,360云盘也好,但最担心的就是同步出现错误,会生成很多不必要 的文件。作者碰到的问题是,一个目录下存放了2000多家上市公司的数据,每家公司单独成一个文件,经过360同步之后,很“幸运”地double了文件 数量,原有的文件是1.txt 2.txt,…,现在变成了1(冲突时的文件备份2016-09-16 15-39-22).txt, 2(冲突时的文件备份2016-09-1615-39-22).txt,…


比较懒的作者就开始思考怎么用程序删除这些文件,很快就找到了解决方案:erase命令可以删除磁盘文件,local下的dir 函数可以识别出文件名(前期推文曾经有过介绍),代码如下:


localfilelist: dir . files "*冲突时的*.txt"这句代码将当前目录下所有文件名中包含“冲突时的”、以.txt为后缀名的文件的文件名放在了local filelist中,

然后是通过循环依次得到每个文件的文件名,执行erase操作即可。

如果只到这里,并没有什么新奇,但是如果出问题的文件夹不只一个,而是一层层嵌套的又该如何呢?解决办法很直接,只需要遍历文件夹下的子目录,发现有不符合规定的文件,删除即可;如果发现还有子文件夹,继续重复上述操作…

进一步提炼上述思路,可以将方法表述如下:

第一步,遍历当前目录,首先区分出子目录和文件两类。

第二步,如果文件,则判断是否满足删除标准,若满足删除,若不满足则误操作。

第三步,如果是子目录,则跳回到第一步,继续执行。

其实这里就包含了一种朴素的“递归”思想,为了实现上述功能必须做到两点:1.区分目录和文件,可以通过local下的dir函数实现,稍后给出代码;2.必须能够实现“重复执行第一步”这样一个递归操作,可以通过函数调用自身实现。 

接下来给出Stata代码,首先是模拟生成文件,在当前目录下生成部分备份冲突文件,同时生成两个子目录abc 和def,在两个子目录下也生成对应的文件:


效果如下图:



代码如下:

这 里首先定义了一个函数erasefile,参数fromdir代表的是要处理的目录,函数的主体分为两部分,首先通过localflist: dir "`fromdir'" files "*冲突时的*.txt"识别出所有满足删除条件的文件,并注意删除;其次通过local dlist: dir "`fromdir'" dirs "*"  识别出当前目录(也就是fromdir代表的目录)下所有的子目录,并针对每个子目录重复erasefile过程。

好了,爬虫酱已将秘技倾囊相授,在成神路上,还需诸君勤谨练习。祝成神路上,且乐且成长。

我们团队原来的微信公众号是“数据处理援助中心”,现在正式搬家到“爬虫俱乐部”,欢迎关注。新的公众号开始,我们推出有问必答栏目,对您提出的问题,我们会尽力回答,并通过推文的形式进行发布。我们也欢迎各位粉丝向公众号投稿。

(编辑 @付彩月)


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

投稿邮箱:xueyuan19920310@163.com 

投稿要求:

1)必须原创,禁止抄袭;

2)必须准确,详细,有例子,有截图;

注意事项:

1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名。

2)邮件请注明投稿,邮件名称为“投稿”+“推文名称”。

3)如果大家遇到关于stata处理分析数据的问题,也可以给该邮箱写邮件,邮件名称为“提问”+“问题名称或者关键词”,我们会在后期的推文里给予解答。

二维码关注公众号




微信扫一扫
关注该公众号