查看原文
其他

用infix读入不完整?用import delimited试试吧

薛原 Stata and Python数据分析 2022-03-15

前一段时间我们在帮一位老师收集数据的时候遇到这么一个网页,在这个网页的源代码中有一个图片的链接,是一长串无意义的乱码。而且这一段代码长度为一百多万个字符。

如下所示:


然而,用infix读入固定宽度的文本内容,其长度是有限制的,我们可以用help limits来查看,最长的长度为50多万个字符。

这个时候如果我们用infix命令读入,会怎么样呢?

提示record too long,只读入了711个观测值,但实际上应该是有1000多行,也就是应当有1000多个观测值,这就是由于那一行太长,导致后面的内容都没有读入。但是偏偏那一行最长的源代码后面也有我们需要的内容,这个时候用infix显然是无法完整读入的,那我们应该用什么命令呢?


在这里向大家隆重介绍import delimited命令。很多朋友应该都使用过这个命令来读入文本文件,如果我们直接用这个命令来读入,会怎么样呢?

我们发现观测值的数量是对了,但是这个时候却变成了6个变量。这是因为默认情况下,import delimited这个命令会根据第一行来判断文本内容是依据逗号还是制表符分隔的。而这个分隔符,我们可以通过选项delimiters()来定义。那我们是不是定义一个文本中不存在的字符,这样就可以保证读入后不会被分成多个变量呢?但我们找一个字符来避免分割实在是太难了,所以我们可以尝试用一串字符作为分隔符,用乱码作为分隔符来对付源代码中的那一行乱码。闭着眼随便敲键盘,很快就可以获得一个乱七八糟的字符串:uabcuiabef23ocn.wievyq;bo.nqc,nc\oqwj1[389y19[3yr8ocalsn。我们把这个字符串填入delimiters()选项中。

import delimited using temp.txt, clear delimiters("uabcuiabef23ocn.wievyq;bo.nqc,nc\oqwj1[389y19[3yr8ocalsn") encoding("utf8")


这个时候忽然发现不对啊,为什么变量反而多了?这是因为在默认情况下,import delimited命令会把字符串中的每一个字符视为一个分隔符,要把整个字符串视为分隔符,需要在选项中加入asstring

import delimited using temp.txt, clear delimiters("uabcuiabef23ocn.wievyq;bo.nqc,nc\oqwj1[389y19[3yr8ocalsn", asstring) encoding("utf-8")


这个时候,我们就把观测值和变量的数量的问题都解决了。这里大家可能会注意到我又加入了一个选项encoding("utf-8"),这是说明这个文本文档的编码是utf-8。Import delimited命令可以设置读入的编码,能在一定程度上方便我们把ASCII编码的文本文档读入到Stata14中,但是这么做也可能会出现一些问题。例如我们在之前介绍unicode命令的推文识得庐山真面目中介绍过有些网页会把复杂的汉字直接采用utf8编码,也就是说我们获得的源代码文件可能不是单纯的ASCII编码,我们使用unicode命令转码是就需要加上transutf8这个选项。那如果用import delimited读入呢?例如我们还用新浪财经上市公司高管页面作为例子。

clear

set more off

copy "http://vip.stock.finance.sina.com.cn/corp/go.php/vCI_CorpManager/stockid/000001.phtml" temp.txt, replace

import delimited using temp.txt, clear delimiters("asbifeqbfi13981", asstring) encoding("gb2312")

keep if index(v1, "</div></td>")

replace v1 = ustrregexra(v1, "^\s+", "")

drop if index(v1, "</strong>") | v1 == "</div></td>"

replace v1 = ustrregexra(v1, "<.*?>", "")

gen v2 = v1[_n + 1]

gen v3 = v1[_n + 2]

gen v4 = v1[_n + 3]

keep if mod(_n, 4) == 1

compress

这个时候我们发现了第98个观测值中间的“·”变成了无法识别的字符。但是如果我们先用unicode命令转码,在读入时将选项改为encoding("utf-8"),就不会出现这样的情况。


此外,我们在之前的推文当源代码只有一行时如何导入?——用rewrite改写文本文档中介绍过,infixinfile两个命令都有一个极大的弊端,就是如果文本文件的最后一行没有换行符,这一行是无法读入的,但是用import delimited就不会存在这个问题。因此,在做网络爬虫读入源代码的意义上,import delimited可以取代infix。但是当你需要定义字典读入复杂的文本文档时,infix和infile还是必不可少的。



以上就是今天给大家分享的内容了,说得好就赏个铜板呗!有钱的捧个钱场,有人的捧个人场~。

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

                      文字编辑:司海涛

技术总编:刘贝贝



往期推文推荐:

1.中国高校财经、管理与综合类期刊灌水排行榜

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的数据处理和分析技巧。

投稿邮箱:statatraining@163.com

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

欢迎关注爬虫俱乐部



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

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