用subinfile修改文件,滚蛋吧,繁琐的命令君!

2016-11-03 薛原 爬虫俱乐部 爬虫俱乐部

诸君安。在我们实际的数据处理中,我们经常使用infile命令导入文件,但是在修改文件的时候却要用到很多的命令,过程极其繁琐。然而,今天,爬虫酱要大喊一句:滚蛋吧,繁琐的命令君!因为爬虫酱有了修改文件的斩月刀——subinfile命令。

subinfile是 由李春涛教授、广西财经学院的高荣老师以及中南财经政法大学的研究生薛原合作编写的一个命令,可以完成保留含有某个字符串或可以匹配上某个正则表达式的 行,替换某个字符串或正则表达式匹配到的字符串,删除空白行等文本文档的修改工作。现在这个命令已经上传到ssc,大家可以通过 ssc install subinfile来完成这个命令的安装工作。这个命令只能在Stata14或者更高的版本中使用。

subinfile始解技能

我们先为大家简单介绍一下subinfile如何使用,例子来源于help文件。

1、生成文本文档



我们用file命令在D盘中生成一个名为temp的文本文档:

clear
set more off
tempname temp
file open `temp' using D:\temp.txt, write text replace
file write `temp' "stata" _n
file write `temp' "abcdefg" _n
file write `temp' "123456789"
file close `temp'
type D:\temp.txt

2、文件修改之替换



现在,我们要把stata替换成STATA,并且把替换后的文件保存成temp1.txt,可以输入如下命令:

subinfile D:\temp.txt, from("stata") to("STATA") save(D:\temp1.txt)
type D:\temp1.txt

在这个命令中,选项from里面输入所要替换的字符串,to里面输入要替换成的字符串,save中输入要保存成的文件路径和文件名。如果在这里不定义这个文件的扩展名,在默认情况下是保存成.txt文件。

我们在替换字符串时,也可以使用正则表达式,将匹配到的字符串替换掉。例如:

subinfile D:\temp.txt, from("[a-z]{7}") to("alphabetic") fromregex save(D:\temp2.txt)

type D:\temp2.txt

在这个命令中,fromregex这个选项代表from选项里面输入的内容是正则表达式,我们使用[a-z]{7}这个正则表达式匹配到了7个小写字母组成的“abcdefg”,并将其替换成“alphabetic”,并且将修改后的文档保存为temp2.txt。

3、文件修改之保留


Subinfile命令也可以帮我们保留文本文档中含有某个字符串的行。比如我们要保留含有字符“a”的行:

subinfile D:\temp.txt, index("a") save(D:\temp3.txt)
type D:\temp3.txt

这样,我们就保留下了含有字母“a”的两行。

同样,在选择保留的行的时候,我们也可以使用正则表达式,将含有能匹配上正则表达式的子字符串的行保留下来:

subinfile D:\temp.txt, index("\d") indexregex save(D:\temp4.txt)

type D:\temp4.txt

选项indexregex代表我们在index选项中输入的内容是正则表达式,我们通过\d来匹配数字,将含有数字的行保留了下来。

4、文件修改之删除


在使用subinfile命令时,如果我们使用from选项却不定义to选项,会把from中匹配到的内容删除掉。同时我们还有一个选项dropempty将空行删除掉。但是如果这一行是有空格的话,用dropempty是删除不掉的。例如我们将所有字母删除掉:

subinfile D:\temp.txt, from("[a-z]") fromregex save(D:\temp5.txt)
type D:\temp5.txt
subinfile D:\temp.txt, from("[a-z]") fromregex dropempty save(D:\temp6.txt)
type D:\temp6.txt

可以看到,在加入dropempty选项之后,前两行空行都被删除掉了。

除 了上面介绍的这些选项,还有一个选项为replace,用来替换掉已经存在的文件。如果不定义save选项而定义了replace,就会把原文件替换掉。 当在一个命令中同时定义了index、from、dropempty这些选项时,执行的顺序为首先保留含有index中的字符串的行,然后替换from选 项中的字符串,最后在将空行删除。


subinfile卍解技能

上面的是一些简单的例子,下面我们介绍一个相对复杂的例子。

比如我们想要知道Stata14安装路径下的文件和文件夹名称并将其保存在一个文本文档中,我们可以使用dir命令来查看该路径下面的文件夹和文件的名字,使用log命令将窗口显示的内容放在文本文档里面。

log using D:\temp.txt, replace
dir D:\Stata14\
log close
type D:\temp.txt

可以看到这个文本文档里面有很多内容,但是我们只要中间那些内容{res}后面跟的文件夹和文件的名字。另外,“.”和“..”并不是这个路径下面的文件或文件夹的名称,需要删除掉。这时,使用subinfile命令,只需要一行命令就可以搞定了:

subinfile D:\temp.txt, index(" \d\/\d+\/\d+") indexregex from("\{.*\}") fromregex save(D:\newtemp)

type D:\newtemp.txt

这个命令中首先用index选项,通过正则表达式保留我们所需要的行。

正 则表达式" \d\/\d+\/\d+"匹配到的就是含有文件名和文件夹名的行中的日期,且月份都为一位数字,即要剔除掉含有“.”和“..”的两行。然后通过正则表 达式的贪婪匹配模式,用"\{.*\}"匹配从{txt}左边的“{”一直到{res}右边的“}”,并将这部分内容删除掉,保留下来的就是我们所要的该 路径下的文件名和文件夹名称。

以上,就是Subinfile命令的简要攻略了!大家赶紧试试这个清新脱俗毫不做作异常实用的命令吧,绝对让你爽到爆!


(编辑 @徐苾雯 强宇曦)

往期推文推荐:

1.天路——chinafin与cntrade命令

2.分时数据,从此唾手可得

3.有了这个命令,以后还怕重复?

4.esttab功能挖掘:“Yes”or“No”

5.用“套路”处理数据

6.厉害了,我stata哥

7.图之多,stata放得下

8.爬虫俱乐部周末送大礼——chinagcode提取中文地址经纬度

9.据说这样数据替换比较快,你试一下,然后……

10.众里寻她千百度,synth命令来帮助!

11.登登等登 凳登等灯——均值t检验ttable2命令

12.I have a Stata, I have a python



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

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


欢迎关注爬虫俱乐部

✬如果你喜欢这篇文章,欢迎分享到朋友圈✬
评论和打赏功能都已开启,灰常接受一切形式的吐槽和赞美

微信扫一扫
关注该公众号