文字编辑:李朋冲

技术总编:刘洪儒

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命令读入,如下图所示:

clearcap mkdir d:/数据读入cd d:/数据读入copy "http://www.stata.com/examples/auto.csv" auto.csv, replace

import delimited auto, clearbr

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

import delimited auto, case(upper) clearbr

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

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

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

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

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

import delimited using auto1.txt, clearbr

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

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

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

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

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

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

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

clearcopy "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的强大数据读入功能吧!

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

投稿要求:

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

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

注意事项:

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

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

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

责任编辑: