大大大大大新闻————自公众号推送视频讲解环节以来,深受广大读者朋友的喜爱。近日向我们提问的粉丝也是大幅增加呐!为了便捷管理相关信息,提高工作效率,我们对提问方式做了略微调整哟~提问者需点击推文底部“阅读原文”下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~
前两篇推文我们带来了json文件的读取利器jsonio命令。顾名思义,jsonio是关于json文件的IO(input & output),我们使用jsonio命令直接读取json文件,就是为了获得比正则表达式更快的速度和更直观的体验。80年代深圳蛇口有一句口号响彻中国:时间就是金钱,效率就是生命。jsonio有着更为便捷多样的json读取方式,可以大大提升读取效率,让我们快快拿起。
jsonio rv,file(“d:\stataABC\jsonio\transit.json”) ob(1) nourl
list
其中, ob(1) 的意思是将本json内容读取到第一行观测值上,如果此时数据集没有第一行观测值,则自动生成。数据集如下:
这个时候我们看到,键值已经被放置在第一行观测值的各个变量中,那么“键”在哪里?小编只看到了jsonvar这些变量名呀!别急,在stata命令输入窗口键入 des命令,发现所有的键名的信息都转成了对应变量的标签。
有的小伙伴就会问了,这么一个选项有什么用呢——当你要做的,不是在一个json文件里提取很多信息,而是在许多json文件里提取某几项信息,它就可以方便地构造循环,急速读取。
jsonio拥有一个强大的选项——elem(),它可以在读取json文件时,即按照一定规则过滤筛选所需要的键值对信息,规则简单易懂,我们举个例子说明,键入如下命令:
clear all
jsonio kv,file(“d:\stataABC\jsonio\transit.json”) nourl elem(“start”)
codebook key
elem(“start”)表示:读取json文件中键名含有字符串“start”的键值对。codebook key表示:查看数据集,可以看到,读取出来的键值对的键名均含有start,结果为:
而且,elem()支持正则表达式匹配
clear all
jsonio kv,file(“d:\stataABC\jsonio\transit.json”) nourl elem(“steps_\d/start_location/lng”)
codebook key
命令提取键名中包含有steps_\d/start_location/lng的键值对,其中\d是正则表达式的特殊元字符,表示数字0-9。命令语句:codebook key 查看结果为:
事实上,由json存储的文件一般富有极强的规律性(因为大部分json文件本身也是计算机批量产生的,为了格式规范易于理解,在键名命名上会非常有规律),因此一些简单的正则表达式,就可以提取出相关的信息。
现在我们的手上有5个json文件,它们是BaiduMap提供的从湖北省武汉市户部巷到五个武汉市内的地方的导航文件,其具体地址如下:
它们的名称分别是rv1.json至rv5.json,我们的目的是,提取每个json文件中,从起点到终点所需时间这一条信息,有些json文件提供了不止一条到达路线(就像我们使用百度地图APP时它会提供多条路线一样),那么也分别记录下来首先我们查看其中的一个json文件。输入命令:
jsonio kv,file("d:\stataABC\jsonio\rv1.json") nourl
得到其中一个json文件的键值对描述,如下所示:
我们可以看到,json文件中关于所需时间的信息,其键名的形式为 /result/routes_#/duration 其中#是第#条路线,而值这个数字以秒为单位。如果我们想批量读取json文件,则它们的信息必然要以“一行观测值”对应“一个json文件”的形式呈现,我们可以使用jsonio rv批量读取json文件,使每一个json文件的信息对应一行观测值,首先,我们以第一个json文件为例:
clear all
jsonio rv, file("d:\stataABC\jsonio\rv1.json") nourl elem(“result/routes_\d/duration”) ob(1)
describe
命令要求仅提取rv1.json文件中 符合elem()要求的信息,即路线耗时信息,并将其输入至第一行观测值中。
可以看到,该文件中有5条路线,因此生成了5个耗时信息。接着,我们将其放入forvalues循环中:
clear all
forvalues i = 1/5{
jsonio rv, file(`"d:\stataABC\jsonio\rv`i'.json"') nourl elem("result/routes_\d/duration") ob(`i')
}
这里,我们循环读取文件夹下的5个json文件(rv1.json、rv2.json到rv5.json),ob(`i’)的意思是,将第一个json文件对应的信息读入到第一行观测值,第二个json文件对应的信息读入到第二行观测值,依次类推。命令窗口输入br,查看数据集:
且变量的标签为:
什么?!没看懂!!不要紧!!戳下面,听爬虫小将的详细讲解,也欢迎大家的批评指正哟!
以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~。另外,我们开通了苹果手机打赏通道,只要扫描下方的二维码,就可以打赏啦!
应广大粉丝要求,爬虫俱乐部的推文公众号打赏功能可以开发票啦,累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫。第一批发票已经寄到各位小主的手中,大家快来给小爬虫打赏呀~
文字编辑:高金凤
技术总编:刘贝贝
往期推文推荐:
5.爬虫俱乐部又出新命令了——wordconvert转换你的word文件
6.putdocx+wordconvert—将实证结果输出到Word(.docx)文档
7.Stata 15之Markdown——没有做不到,只有想不到!
关于我们
微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。
此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿”+“推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。
欢迎关注爬虫俱乐部
微信扫一扫
关注该公众号