subinfile 再创新高

2017-11-22 高金凤 爬虫俱乐部 爬虫俱乐部


    有问题,不要怕!点击推文底部“阅读原文”下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~

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

好消息,好消息!修改文件的斩月刀——subinfile命令,近期又更新了呢!欢迎大家及时更新(ssc install subinfile ,replace)。在往期推文中,我们也多次介绍过subinfile命令,该命令可以替换、保留、删除文本文件中的内容,常用于网页源代码的处理。本次主要对5项内容进行了更新,分别是:

第一,from()…to()选项由原来的只可替换单个字符串变为可以替换多个字符串,当然也可以是正则表达式。

第二,增加append选项可以将多次修改的内容放在同一个文本文件中。

第三,将原来的选项dropempty修改为dropblank,表示删除文本文件中多余的空行。

第四,增加选项drop(),用来删除带有某些特征的行,另外,该选项与dropreg结合,可以与正则表达式一起使用。

第五,增加order()选项,可以对选项index()、drop()、from()、dropblank的顺序进行调整,默认情况下顺序依次为:index()、drop()、from()、dropblank。下面先以help文件中的例子给大家介绍其详细用法。

首先,生成一个临时文件temp.txt,输入如下命令:

clear

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' _n

file write `temp' "123456789" "number 1"

file close `temp'

type D:\temp.txt

显示文件temp.txt内容如下所示:

接着,我们用到命令subinfile对文本文件temp.txt做一些修改,如下所示:

1.替换

subinfile D:\temp.txt, index("stata") save(D:\temp1.txt) replace  //定位到含有“stata”的行,并保存为temp1.txt

subinfile D:\temp1.txt, from("stata" "爬虫俱乐部") to("STATA" "Stata Club") save(D:\temp2.txt) replace  //将temp1.txt中的字符串"stata" 和"爬虫俱乐部"分别替换为"STATA" 和"Stata Club"

type D:\temp2.txt

结果如下:

2.合并

subinfile D:\temp.txt, index("[0-9]") indexregex save(D:\temp3.txt) replace  //定位到含有数字的行保存为temp3.txt

type D:\temp3.txt

subinfile D:\temp3.txt, from("[0-9]{2,}") to("alphabetic") fromregex save(D:\temp2.txt) append  //将temp3.txt中的至少含有2个数字组合的替换为"alphabetic",并将替换后的内容合并到文件temp2.txt中。

type D:\temp2.txt

结果如下:

 3.删除空行

subinfile D:\temp.txt, dropblank save(D:\temp4.txt) replace  //删除temp.txt中的空行,结果保存为temp4.txt。

type D:\temp4.txt

结果如下:

 4.删除文本内容

subinfile D:\temp4.txt, drop("[0-9]+") dropregex save(D:\temp5.txt) replace  //删除文件temp4.txt中含有数字的行。

type D:\temp5.txt

结果如下:

5.选项排序

subinfile D:\temp.txt, index("[a-z]") indexregex drop("stata") from("[a-z]") to("X") fromregex save("D:\temp6.txt") replace  //先定位到含有小写字母的行,然后删除含有stata的行,最后将所有的小写字母都换成X。

type D:\temp6.txt

结果如下:

subinfile D:\temp.txt, index("[a-z]") indexregex drop("stata") from("[a-z]") to("X") fromregex order(index from drop) save("D:\temp7.txt") replace  //更改上面程序选项顺序为先定位再替换最后删除。

type D:\temp7.txt

结果如下:

以上就是命令suninfile更新后,各个选项的用法。

下面我们以抓取波士顿大学经济学院一个stata学习网站上为例,介绍subinfile命令在处理源代码时,如何实现它的强大之处。在这个网页(https://ideas.repec.org/s/boc/bocode.html)中,我们想要提取每篇文章的编号、文章题目和作者,打开网页源代码:

发现网页中除了我们想要的编号、文章题目和作者之外,还有其他的不重要的信息,一般情况下,我们会将源代码导入Stata,然后用正则表达式或字符串函数进行处理,最终得到目标信息,并整合成我们需要的格式。而subinfile 命令只需要一行命令,就能把网页源代码处理成为我们最终想要的结果,它是如何做到的呢?具体来看,输入命令:

copy "https://ideas.repec.org/s/boc/bocode.html" "D:\temp8.txt", replace

subinfile D:\temp8.txt, index(`"<LI class=""') from("(<A HREF=.*?>)|(</A></B><BR><I>)" "<.*?>")   fromregex to("!@#$%^&*()_+" "") replace  

import delimited using D:\temp8.txt, clear delimiter("!@#$%^&*()_+", asstring)

br

命令行注释:

首 先将源代码copy到文档"D:\temp8.txt中;然后定位到含有公共标签"<LI class=""的行,将“<A HREF=.*?>”或者“</A></B><BR><I>”替换为一个唯一识别的字符 串"!@#$%^&*()_+",方便下一步读入的时候进行分列,同时也将尖括号中的内容替换为空;最后用到import dlimited命令将处理好的网页源代码读入Stata。

可以看到,用subinfile这支利器,只需一行命令就帮助我们从密密麻麻的网页源代码中提取到我们所需要的信息,有木有涨知识呢!

        注:此推文中的图片及封面(除操作部分的)均来源于网络!如有雷同,纯属巧合!

以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~。另外,我们开通了苹果手机打赏通道,只要扫描下方的二维码,就可以打赏啦!

         应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您 更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~

文字编辑/王   悦

技术总编/刘贝贝


往期推文推荐:

1.高校学术大神:你的导师上榜了吗?

2.中国高校财经、管理与综合类期刊灌水排行榜

3.命令sum2docx输出统计量表到docx文件

4.reg2docx报告你的实证结果吧!

5.爬虫俱乐部又出新命令了——wordconvert转换你的word文件

6.putdocx+wordconvert—将实证结果输出到Word.docx)文档

7.Stata 15Markdown——没有做不到,只有想不到!

8.矩阵和宏的故事

9.shelloutopen anything

10.Putpdf--神奇的转换工具



关于我们

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

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

投稿邮箱:statatraining@163.com

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

欢迎关注爬虫俱乐部

微信扫一扫
关注该公众号