【有问必答】通过处理字符串来确定读入范围

2017-01-10 薛原 爬虫俱乐部 爬虫俱乐部

前一段时间,我们转载了小花经济学术的推文——《如何用Stata批量读取多张工作表的Excel文件》。有朋友在按照上面的程序批量读入数据时就遇到了这样的一个问题。他所要读入的数据是这样的。


如上图,这个数据所要读入的范围是A2:H14。当我们加入describe选项运行import excel命令时,可以看到共有两个sheet,每个sheet的数据范围都是A1:H14

import excel using "数据.xlsx", describe

这个时候如果我们直接运行之前推文中给出的程序,读入每一个sheet的数据,并且分别保存成dta文件,会怎么样呢?

import excel using "数据.xlsx", describe

forvalues s = 1/`r(N_worksheet)' {

       import excel using "数据.xlsx", sheet(`r(worksheet_`s')') cellrange(`r(range_`s')') firstrow clear

       save newstata`s'.dta, replace

}


可以看到,数据中的第一行出现在了变量名的位置,而本应当作为变量名的第二行变成了读入后的dta文件的第一行。在这个经过截取的数据中,两个sheet的数据范围都是A1:H14,针对这么一个特殊的例子,我们当然可以把cellrange这个选项中的范围直接替换成A2:H14,但现实中我们是有很多个Excel文件,每个文件有很多sheet,每个sheet的数据范围也并不完全相同,我们无法一一确定每个sheet需要读入的数据范围。我们当然可以读入后用drop in 1删除掉第一行,再用rename来修改变量名,但这样会使程序过长。有没有简单一些的办法呢?在这里,笔者用的方法是处理字符串,来改变读入的范围。

通过观察我们可以发现,每个sheet中的相同点是第一行都是我们不需要的,我们需要的数据范围是从A2开始的。那么剩下的问题就是我们如何找出数据范围到哪个单元格为止,也就是cellrange这个选项中冒号右边的单元格。彭文威的推文中已经介绍了,在import excel命令中加入describe这个选项后再用return list可以看到每一个sheet的情况都被储存到了宏里面。

比如我们要看sheet_1的数据范围,就可以用命令dis"`r(range_1)'"


那么我们对这个字符串进行处理,就可以获得数据范围右边的单元格。也就是说,我们要对这个字符串进行截取。这里我们用到的字符串函数就是substr()函数。比如这里我们要截取的是第3个字符到最后一个字符的子字符串":H14",可以写成substr("`r(range_1)'", 3, .)。这里需要说明的是这些表单数据范围都是从A1开始,否则我们还需要将开始的字符位置通过index()函数或者strpos()函数定位到""的位置,即写成substr("`r(range_1)'", index("`r(range_1)'", ":"), .)。我们将这个子字符串定义为局部宏x,并将A2与局部宏x组合在一起,就可以得到我们要读入的数据范围了。

local x = substr("`r(range_1)'", 3, .)

dis "A2`x'"


这时,我们只需要将cellrange选项中的范围改为A2`x’就可以了。命令如下:

import excel using "数据.xlsx", describe

forvalues s = 1/`r(N_worksheet)' {

       local x = substr("`r(range_`s')'", 3, .)

       import excel using "数据.xlsx", sheet(`r(worksheet_`s')') cellrange(A2`x') firstrow clear

       save newstata`s'.dta, replace

}



    这时,我们读入的数据就正常了。以上只是笔者个人对于这个问题的一个小小的看法。如果你有很好的方法,欢迎留言交流。

全国空气质量如下图



河南的朋友请保重



以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~,点赞打赏随您心意,么么哒~

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

编辑 by梅洁瓷傲

往期推文推荐:

1.我来告诉你stata命令有多少

2.关于RTF你不知道的命令

3.关于RTF你不知道的命令之番外篇

4.免费事件研究,一片片从邮局寄来

5.免费的股价同步性,一片片从邮局寄来

6.Stata叫你回家听音乐了!

7.一言不合就用stata写邮件(Outlook/Foxmail)

8.玩转stata之调用浏览器

9.I have a Stata, I have a python

10.I have a Stata, I have a Python之二——pdf转word




关于我们

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


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

投稿邮箱:xueyuan19920310@163.com

投稿要求:

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

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

注意事项:

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

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

3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


欢迎关注爬虫俱乐部


微信扫一扫
关注该公众号