查看原文
其他

分行显示的固定宽度文件读入 —— 数据字典法

爬虫俱乐部 Stata and Python数据分析 2022-03-15

2019已经迎来了第一个晨曦,2018已成过往。但我们不能忘却,爬虫俱乐部感谢各位读者在2018的支持与厚爱。有了大家的肯定,我们会更加努力,用更好的文章和数据解决方案回馈您的热情参与!

前两天武汉的一场雪,是对2019的礼赞,我们和您一起分享这份喜悦。爬虫俱乐部也衷心地祝福大家:新年快乐!


本文作者:孙雪丽

本文编辑:李朋冲

技术总编:李春涛

爬虫俱乐部将于2019年1月19日至25日在武汉举行两期Stata编程技术定制培训,此次采取初级班和高级班分批次培训模式,采用理论与案例相结合的方式,旨在帮助大家熟悉Stata核心的爬虫技术,以及Stata与其他软件交互的高端技术。详细培训大纲及报名方式,请见往期推文《2019寒假Stata编程技术定制培训班》。报名表下载请点击文末阅读原文呦~

Stata在读入文本文档时一般是将每一行作为一个观测值进行读入,但是我们也会遇到一些特殊的文件 —— 一个观测值的信息会分行显示。如何将这些多行的信息作为一个观测值读入呢?今天我们介绍两个内容:一是使用临时句柄创建一个分行显示的固定宽度文件;二是用数据字典将该文件读入Stata。

一、创建分行显示的固定宽度文件

自己动手,丰衣足食。构造分行显示的固定宽度文件时,我们主要通过tempname handle创建一个临时的句柄handle来实现。handle可以理解为一只神笔,可以用它在文本文件中写字,但是这支笔很笨,我们必须告诉它在什么位置怎么写。比如:

file write `handle' _col(1) "Name" _col(20) "Age"

就是在文本文件当前行第一列开始写入字符串"Name", 然后在同一行第20列开始写入字符串"Age"。

handle这支笔是临时存在的,创建之后便可以通过file命令调用handle打开指定文件,并使用handle在文件中写入我们想要写入的信息。句柄关闭后,handle便不复存在。假如我们想要构建一个有关学生成绩的分行显示数据,可执行以下程序:

clear cap mkdir D:/学生成绩 cd D:/学生成绩 tempname handle //生成一个临时句柄`handle’ file open `handle' using stgrade.txt, text write replace file write `handle' _col(1) "Name" _col(20) "Age" _col(30) "Math" _col(40) "English" _n file write `handle' _col(1) "Economics" _col(15) "FineArts" _n file write `handle' _col(1) "History" _n file close `handle'

程序中句柄handle创建后,file open命令通过调用handle在目录下新建了一个名为stgrade.txt的空文本文件,若这一文件已经在磁盘上存在,则replace选项会要求用一个空文件覆盖原来存在的文本文件(读者可以理解为先删除原来已经存在的文件stgrade.txt)。file write命令通过调用神笔handle将姓名、年龄、学科等信息写入新建的文件中,_col(#)指定将信息写入第#列,_n表示换行,写完后通过file close命令将句柄handle关闭。生成的文件如下:

可以看到经过多次换行,我们将学生的各门成绩显示在了三行。然后我们使用推文《30行代码教你选一个优秀的英文名》爬取的英文名大全中的部分数据代表学生,随机地为其生成年龄及各个科目的成绩,并将这些信息写入stgrade.txt中。运行以下完整程序:

clear cap mkdir D:/学生成绩 cd D:/学生成绩 tempname handle //生成一个临时句柄`handle’ file open `handle' using stgrade.txt,text write replace file write `handle' _col(1) "Name" _col(20) "Age" _col(30) "Math" _col(40) "English" _n file write `handle' _col(1) "Economics" _col(15) "FineArts" _n file write `handle' _col(1) "History" _n use allname.dta,clear *注:此数据来源于往期推文,没有此数据的读者可自行创建一份简短的名单 sample 200, count set seed 123446 levelsof name, local(levels) foreach name in `r(levels)' {    file write `handle' _col(1) "`name'" _col(20) (`=int(10+uniform()*10)') _col(30) (`=int(80+uniform()*20)') _col(40) (`=int(70+uniform()*30)') _n    file write `handle' _col(1) (`=int(60+uniform()*40)') _col(15) (`=int(50+uniform()*50)') _n    file write `handle' _col(1) (`=int(40+uniform()*60)') _n    file write `handle' "************************************" _n    file write `handle' "************************************" _n    file write `handle' "************************************" _n } file close `handle' shellout stgrade.txt  //打开写好的文件

这样我们就构造了一份3行显示一条观测值信息的固定宽度数据,并将每个观测值信息用三行*号分隔,如下图:

爬虫俱乐部是您身边的科研助手,能够为您在数据处理实证研究中提供帮助。承蒙近四万粉丝的支持与厚爱,我们在腾讯课堂推出了网络视频课程,专注于数据整理、网络爬虫、循环命令编制和结果输出…李老师及团队精彩地讲解,深入浅出,注重案例与实战,让您更加快速高效地掌握Stata技巧及数据处理的精髓,而且可以无限次重复观看,在原有课程基础上已上传了三节全新的内容!百分百好评,简单易学,一个月让您从入门到精通。绝对物超所值!观看学习网址:

https://ke.qq.com/course/286526?tuin=1b60b462

敬请关注!

二、用数据字典读入数据

对于stgrade.txt这一数据,我们可以尝试用insheet、import delimited等方式进行读入,会发现读入的数据多少有些难以处理。对于这类文件,数据字典就是一个十分好用的读入方法,通过换行它可以帮我们把多行数据当做一条观测值读入。数据字典是使用do文件编辑器或其它的文本编辑器创建的一个文本文件,这个文本文件告诉Stata应如何从stgrade.txt中读取固定格式的数据。这里我们使用记事本来创建数据字典:

注:数据字典编辑完成后要回车将光标移至下一行,否则无法成功读入。

dictionary.txt就是我们在目录下创建的数据字典,它告诉我们读取一个样本的规则:_newline表示换行, 其出现了两次意味着每读取一条观测值要进行两次换行;stgrade.txt是数据字典要读入的文件名;_column(#)表示从第#列开始读取;str#表示读取的数据类型是长度为#的字符型变量;Name、Age等是读取的变量名称;%#s表示读取的字符型变量的格式。至此,数据字典创建完成。我们如何在Stata中调用字典读取stgrade.txt中的数据呢?程序如下:

clear infile using dictionary.txt

Stata读入了399个观测值,如下(部分截取):

可以看到,通过数据字典Stata将文本文件中每三行信息作为一条观测值读入一行中,每两个观测值间的三行*号也被当做一个观测值读入了Stata。不难发现我们需要的学生成绩信息都处于偶数行,因此删除奇数行,并将字符型变量转化为数值型变量,程序如下:

drop if mod(_n, 2) == 1      //mod()为求余函数 destring _all, replace save stgrade.dta, replace

简单处理后,最终读入的数据如下(部分截取):

以上就是用数据字典读入分行显示的固定宽度数据的方法。但是,对于这类文件,不止数据字典这一种读入方法,在后续的推文中我们会继续为大家介绍其他读入方法,敬请关注!

有问题,不要怕!访问 

http://www.wuhanstring.com/uploads/5_aboutus/爬虫俱乐部-用户问题登记表.docx (复制到浏览器中)下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~

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

爬虫俱乐部隆重推出数据定制及处理业务,您有任何网页数据获取及处理方面的难题,请发邮件至我们邮箱statatraining@163.com,届时会有俱乐部高级会员为您排忧解难!

对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!

往期推文推荐

关于我们

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


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

投稿邮箱:statatraining@163.com

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

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存