查看原文
其他

数据读入系列之 import delimited 介绍

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


本文作者:石河子大学  王涛

文字编辑:李朋冲

技术总编:刘洪儒


好消息!!!爬虫俱乐部将于2018年11月30日至2018年12月2日在武汉举行Stata编程技术培训。本次培训主要面向财务、会计和金融专业高校教师、硕博生,课程均是采用财务金融领域的案例,旨在帮助财务金融领域的研究者熟悉Stata数据分析技巧,能够通过编程读取不同类型的数据源、实现复杂数据合并、清洗的程序化,通过简单的程序构造复杂的财务金融指标。详细培训大纲及报名方式,请点击文末阅读原文呦~

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

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

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

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



import delimited 除了能读入一般文本文件外,还是网络源代码读入的利器,能够实现对网络源代码的完整读入。相较于infix和infile,它具有如下优点:

(1)突破了infix和infile读入固定宽度(最大长度为524,275个字符)的限制。

(2)解决了infix和infilie在网页源代码文本文件最后一行没有换行符时无法读入的问题(此问题Stata15版已更新解决)。

下面我们来认识下这个强大命令!

import delimited的语法结构如下:

import delimited [using] filename [, import_delimited_options]

常用选项有:

delimiters("chars"[, collapse|asstring])

①  不指定分隔符时,默认以逗号和制表符为分隔符

②  指定分隔符时, collapse选项把字符串中的每一个字符视为一个分隔符(默认情况),asstring选项把整个字符串视为一个分隔符。

例如,delimiters(“chars”,collapse)会将“c”,“h”,“a”“r”“s”都作为分隔符,而delimiters(“chars”,asstring)会将“chars”作为一个分隔符。

rowrange([start][:end]):指定读入的行范围

colrange([start][:end]):指定读入的列范围

case(preserve|lower|upper):指定导入变量名的大小写,默认小写

numericcols(numlist|_all):指定某列或全部列为数值型

stringcols(numlist|_all):指定某列或全部列为字符型

encoding("encoding"):指定数据编码类型

下面,我们通过两个例子来了解 import delimited 命令的具体使用方法。


例一:Stata网站auto示例数据

我们可从Stata网站copy下auto示例数据,将之存储为auto.csv文件,并用import delimited命令读入,如下图所示:

clear cap mkdir d:/数据读入 cd d:/数据读入 copy "http://www.stata.com/examples/auto.csv" auto.csv, replace
import delimited auto, clear br

若想让变量名全部以大写字母表示,可加选项case,键入:

import delimited auto, case(upper) clear br

我们也可以导入数据集的任意子集,如需要的数据范围为第2-5行,第1-3列,键入:

import delimited auto, rowrange(2:5) colrange(:3) clear br

值得注意的是,Stata默认以制表符和逗号作为分隔符,如果文本文件是以其它的分隔符分隔,如空格,直接读入时将不能很好地识别。

我们仍以auto.csv示例数据为例。首先读入auto数据,将其保存为以空格为分隔符的文本文件,键入:

import delimited using auto, clear export delimited using auto1.txt, delimiter(" ") quote replace //空格分隔符
import delimited using auto1.txt, clear br

上图显示,所有变量都读入到了一列中,这显然不是我们想要的结果。此时,我们需要明确指定具体的分隔符——空格,键入:

import delimited using auto1.txt, delimiter(" ") clear br

此外,我们还可以指定变量的存储类型,如指定变量rep78为字符型,键入:

import delimited using auto1.txt, delimiter(" ") stringcols(4) clear br

以上是以auto.csv数据为例对import delimited命令做了基本的介绍。然而,处理网页源代码时,会因网页编码不同而使数据读入出现乱码,这涉及转码问题,而import delimited的encoding选项能很好地解决这一问题。


例二:新浪财经长江电力(600900)高管数据

使用copy命令将新浪财经中长江电力高管数据网页源代码爬取下来,存储为temp.txt,并导入到stata,键入:

clear copy "http://vip.stock.finance.sina.com.cn/corp/go.php/vCI_CorpManager/stockid/600900.phtml" temp.txt, replace
import delimited using temp.txt, delimiter("pachongjulebu_No.1",asstring) clear //分隔字符串必须是与源代码无重复的字符串,以确保源代码在一个变量下读入,asstring选项将字符串整体作为分隔符。 br in 1/10

显然,导入到stata后,有很多不能正常阅读的混乱字符,俗称乱码。我们可利用import delimited的encoding选项解决这些乱码。在查看网页源代码时,我们可看到第8行有charset=gb2312(见下图):

即,此网页以gb2312编码,我们据此可知encoding选项中应填入的编码方式,键入:

import delimited using temp.txt, encoding("gb18030") ///    delimiter("pachongjulebu_No.1",asstring) clear //一般用gb18030,因其囊括gb2312,转码更为准确。 br in 1/10

这时,所有乱码都能正常显示。然后,我们保留高管信息所在行,并使用正则表达式提取所需高管信息数据,键入:

keep if ustrregexm(v1, "\S(?<!</strong>)</div></td>") //使用正则表达式前后查找,保留含有"</div></td>"标签且该标签左边为非空字符且不是"</strong>"标签的行 replace v1 = ustrregexra(v1, "<.*?>", "") //使用正则表达式懒惰模式将含有"<>"的内容全部替换为空,只保留我们需要的高管姓名、高管职务、起始任职日期和终止任职日期 br

最后,将数据变为宽型数据。通过观察数据可知,4个纵向观测值是一组,每一组值可合为一条横向观测值,所以,我们定义三个新变量v11、v12和v13,并利用循环将每组数据后三个观测值分别赋值于变量v11、v12和v13下,然后保留每组第一条观测值并对变量进行重命名,最终得到干净的数据。程序如下:

forvalues i=1/3 {          gen v1`i' = v1[_n+`i'] } keep if mod(_n, 4) == 1
rename (v1 v11 v12 v13) (姓名 职务 起始任职日期 终止任职日期 ) compress
br   export delimited using manager.txt, delimiter(";") replace //导出高管任职信息,以";"分隔

以上便是处理后的最终结果(部分截图)。赶紧趁热打铁,爬取一个网络数据,见证下import delimited的强大数据读入功能吧!



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

往期推文推荐

关于我们

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

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

投稿邮箱:statatraining@163.com

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

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

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