诸君安。在我们实际的数据处理中,我们经常使用infile命令导入文件,但是在修改文件的时候却要用到很多的命令,过程极其繁琐。然而,今天,爬虫酱要大喊一句:滚蛋吧,繁琐的命令君!因为爬虫酱有了修改文件的斩月刀——subinfile命令。
subinfile是 由李春涛教授、广西财经学院的高荣老师以及中南财经政法大学的研究生薛原合作编写的一个命令,可以完成保留含有某个字符串或可以匹配上某个正则表达式的 行,替换某个字符串或正则表达式匹配到的字符串,删除空白行等文本文档的修改工作。现在这个命令已经上传到ssc,大家可以通过 ssc install subinfile来完成这个命令的安装工作。这个命令只能在Stata14或者更高的版本中使用。
我们先为大家简单介绍一下subinfile如何使用,例子来源于help文件。
1、生成文本文档
我们用file命令在D盘中生成一个名为temp的文本文档:
2、文件修改之替换
现在,我们要把stata替换成STATA,并且把替换后的文件保存成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。
Subinfile命令也可以帮我们保留文本文档中含有某个字符串的行。比如我们要保留含有字符“a”的行:
这样,我们就保留下了含有字母“a”的两行。
同样,在选择保留的行的时候,我们也可以使用正则表达式,将含有能匹配上正则表达式的子字符串的行保留下来:
subinfile D:\temp.txt, index("\d") indexregex save(D:\temp4.txt)
type D:\temp4.txt
选项indexregex代表我们在index选项中输入的内容是正则表达式,我们通过\d来匹配数字,将含有数字的行保留了下来。
在使用subinfile命令时,如果我们使用from选项却不定义to选项,会把from中匹配到的内容删除掉。同时我们还有一个选项dropempty将空行删除掉。但是如果这一行是有空格的话,用dropempty是删除不掉的。例如我们将所有字母删除掉:
可以看到,在加入dropempty选项之后,前两行空行都被删除掉了。
除 了上面介绍的这些选项,还有一个选项为replace,用来替换掉已经存在的文件。如果不定义save选项而定义了replace,就会把原文件替换掉。 当在一个命令中同时定义了index、from、dropempty这些选项时,执行的顺序为首先保留含有index中的字符串的行,然后替换from选 项中的字符串,最后在将空行删除。
上面的是一些简单的例子,下面我们介绍一个相对复杂的例子。
比如我们想要知道Stata14安装路径下的文件和文件夹名称并将其保存在一个文本文档中,我们可以使用dir命令来查看该路径下面的文件夹和文件的名字,使用log命令将窗口显示的内容放在文本文档里面。
可以看到这个文本文档里面有很多内容,但是我们只要中间那些内容{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命令的简要攻略了!大家赶紧试试这个清新脱俗毫不做作异常实用的命令吧,绝对让你爽到爆!
(编辑 @徐苾雯 强宇曦)
往期推文推荐:
8.爬虫俱乐部周末送大礼——chinagcode提取中文地址经纬度
12.I have a Stata, I have a python
此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。
欢迎关注爬虫俱乐部
微信扫一扫
关注该公众号