查看原文
其他

import delimited | 再也不用担心读入网页源代码“乱七芭蕉”了

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

本文作者:戴   雯,中南财经政法大学金融学院

本文编辑:崔赵雯

技术总编:余术玲 

爬虫俱乐部云端课程

  爬虫俱乐部于2020年暑期在线上举办的Stata与Python编程技术训练营和Stata数据分析法律与制度专题训练营已经圆满结束啦~应广大学员需求,我们的课程现已在腾讯课堂全面上线,且继续提供答疑服务。现在关注公众号并在朋友圈转发推文《来腾讯课堂学Stata和Python啦》或《8月Stata数据分析法律与制度专场来啦!》,即可获得600元课程优惠券,集赞50个再领200元课程优惠券!(截图发至本公众号后台领取)原价2400元的课程,现在只要1600元

1 应用背景

在日常工作中,我们经常需要把文本文件或者网页源代码读入到Stata中,从而进行后续的数据处理和分析。读入文本文件的方法主要有以下三种:
  • infix

  • fileread()函数

  • import delimited

infix,主要用来读取具有固定宽度的文本文件,宽度限制在524,275个字符以内,可以读入以一行或多行排列的变量;会自动删除文本文件开头的空白字符,同时当最后一行没有换行符时无法读入。
fileread()函数,不能够识别换行符,会将文本内容全部读入到同一个单元格内,通常用于网页源代码的读入。
import delimited,用于读入用分隔符分隔的文本文件,这个分隔符可以是逗号、制表符,也可以是自己定义的任意一种形式的分隔符。主要有以下三个优点:① 突破了infix对于固定宽度的限制;② 保证数据读入的完整性,解决了最后一行没有换行符时无法读入的问题;③其自带的encoding选项可以对网页源代码进行转码,确保读入的正确性。

2 语法介绍

import delimited的基本语法如下:
import delimited [using] filename [, import_delimited_options]
  • 其中,import delimited 为命令主体,不可省略;

  • using 为指定读入的文件,读入整个文本文件时可省略;

  • filename 为读入文本文件的文件名,一般来说,文本文件分为以逗号分隔的csv文件和以制表符分隔的txt文件;

  • import_delimited_options 为在基础命令上添加的选项。

import delimited 中包含了丰富的选项,下面小编就选取一些比较常用的为大家介绍:
import_delimited_options用途
clear替换内存的已有数据
rowrange([start][:end])指定读入的行范围
colrange([start][:end])指定读入的列范围
numericcols(numlist|_all)指定某列或全部列为数值型
stringcols(numlist|_all)指定某列或全部列为字符型
case(preserve|lower|upper)指定读入的变量名的大小写,默认小写
encoding(encoding)指定数据编码类型
delimiters("chars"[, collapse|asstring])指定分隔符

值得注意的是,如果不指定分隔符,默认以逗号或制表符为分隔符;如果指定分隔符,collapse 选项表示将字符串中的每个字符分为视为一个分隔符,asstring 选项表示将字符串作为整体视为一个分隔符。比如,delimiters("chars",collapse) 会将“c”、“h”、“a”、“r”、“s”都作为分隔符,而 delimiters("chars",asstring)则是将“chars”整体作为一个分隔符

3 应用案例

3.1 Stata网站auto示例数据

在这个案例中,我们以Stata中自带的auto数据为例,为大家讲解import delimited 的一些基本操作。
  • 首先,运用 copy 命令将auto数据集复制下来,储存为auto.txt,并导入到Stata中:

clearcap mkdir "d:/import delimited"cd "d:/import delimited"copy "https://www.stata.com/examples/auto.csv" auto.txt,replace
  • 操作一:读入整个auto文件

import delimited auto.txt,clear
list

*结果显示如下:
+------------------------------------------------+
| make price mpg rep78 foreign |
|------------------------------------------------|
1. | AMC Concord 4099 22 3 Domestic |
2. | AMC Pacer 4749 17 3 Domestic |
3. | AMC Spirit 3799 22 . Domestic |
4. | Buick Century 4816 20 3 Domestic |
5. | Buick Electra 7827 15 4 Domestic |
|------------------------------------------------|
6. | Buick LeSabre 5788 18 3 Domestic |
7. | Buick Opel 4453 26 . Domestic |
8. | Buick Regal 5189 20 3 Domestic |
9. | Buick Riviera 10372 16 3 Domestic |
10. | Buick Skylark 4082 19 3 Domestic |
+------------------------------------------------+

  • 操作二:将变量名全部以大写表示,使用case选项

import delimited auto.txt, case(upper) clear
list

*结果显示如下
+------------------------------------------------+
| MAKE PRICE MPG REP78 FOREIGN |
|------------------------------------------------|
1. | AMC Concord 4099 22 3 Domestic |
2. | AMC Pacer 4749 17 3 Domestic |
3. | AMC Spirit 3799 22 . Domestic |
4. | Buick Century 4816 20 3 Domestic |
5. | Buick Electra 7827 15 4 Domestic |
|------------------------------------------------|
6. | Buick LeSabre 5788 18 3 Domestic |
7. | Buick Opel 4453 26 . Domestic |
8. | Buick Regal 5189 20 3 Domestic |
9. | Buick Riviera 10372 16 3 Domestic |
10. | Buick Skylark 4082 19 3 Domestic |
+------------------------------------------------+

  • 操作三:通过rowrange和colrange设置读入的行和列范围,这里读入的是auto文件的2-4行和1-3列

import delimited auto.txt, rowrange(2:4) colrange(1:3) clear
list

*结果显示如下:
+---------------------------+
| make price mpg |
|---------------------------|
1. | AMC Concord 4099 22 |
2. | AMC Pacer 4749 17 |
3. | AMC Spirit 3799 22 |
+---------------------------+

如果要读入从第一行(列)开始,到某一行(列)的数据,可以直接写 : + 截止的行(列)数 ;如果要读入从某一行(列)开始,直到最后一行(列)的数据,可以直接写 开始的行(列)数 。下面的代码表示读入auto文件的第3行到最后一行、第1列到第3列。

import delimited auto.txt, rowrange(3) colrange(:3) clear
list

*结果显示如下:
+-----------------------------+
| make price mpg |
|-----------------------------|
1. | AMC Pacer 4749 17 |
2. | AMC Spirit 3799 22 |
3. | Buick Century 4816 20 |
4. | Buick Electra 7827 15 |
5. | Buick LeSabre 5788 18 |
|-----------------------------|
6. | Buick Opel 4453 26 |
7. | Buick Regal 5189 20 |
8. | Buick Riviera 10372 16 |
9. | Buick Skylark 4082 19 |
+-----------------------------+

3.2 读入新浪财经平安银行(000001)高管数据

import delimited 也是读入网页源代码的利器,encoding 选项可以解决网页源代码乱码的问题。首先,用 copy 命令获取网页源代码,储存为temp.txt,并导入到Stata中。
clear allcopy "http://vip.stock.finance.sina.com.cn/corp/go.php/vCI_CorpManager/stockid/000001.phtml" temp.txt,replaceimport delimited using temp.txt,clear
看到导入结果的那一刻,哎呀,大事不妙,都是乱码呀!别着急,encoding 选项来帮你~
在网页源代码中搜索 charset,我们发现此网页以gb2312编码,这里我们使用gb18030,因为gb18030向下兼容gb2312,转码更为准确!

加入 encoding 选项,键入以下代码:
import delimited using temp.txt, encoding("gb18030") clear
得到结果如下图所示,可以看出,乱码的问题虽然解决了,可是,怎么读入了12个变量?这是因为 import delimited 默认以水平制表符和逗号分隔,一旦出现水平制表符和逗号,就会自动进行分隔。

在处理源代码时,通常需要让它在一个变量下,再用字符串处理的方法提取我们所需要的信息,那怎么把12个变量合成一个变量呢?可以自定义分隔符!那分隔符怎么去定义呢?我们可以闭上眼睛,随意敲击键盘多次,敲出一串乱七八糟的字符就对了,因为只要保证敲出来的这个分隔符在源代码中没有出现,就可以把源代码读入到一个变量里。
*比如这里我们定义分隔符为"jeemswo1ij-02fg",通过delimiters的asstring选项可以将字符串整体作为分隔符import delimited using temp.txt, encoding("gb18030") delimiters("jeemswo1ij-02fg", asstring) clear
终于,源代码成功读入,没有发生乱码,并且在一个变量里~

以上就是本期推文的全部内容啦,无论是读取普通的文本文件,还是网页源代码,import delimited 都扮演着重要的角色,小伙伴们赶紧趁热打铁,试一试吧~




对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐

如何简洁地列出指定属性的变量?ds命令来了!

如何在Python中进行描述性统计分析?

分析师和他们的雇主重视与管理层接触吗?——分析师参与盈余电话会议的研究

繁忙的董事与公司业绩:来自并购的证据使用Python接口读取CSMAR数据列表生成式|让你的代码简洁又美观Stata中变量观测值的亲密伙伴——levelsof命令

爬虫俱乐部开发的命令更新及常见问题说明

Seminar | 道德培训真的有用吗?

网络爬虫入门之requests 库的基本使用——以亚马逊图书界面为例reduce()函数和filter()函数闪亮登场“环环”入扣之foreach命令

统计年鉴数据整理小技巧

Seminar | 作为飞行员,我比别的CEO多了什么?

利用TensorFlow构建前馈神经网络

推文合集(1)| Stata学习者必看的n篇推文!

Seminar | 诚信的价值

利用tushare获取股票数据及实现可视化

从Excel到Stata的“摆渡车”——import excel命令

光阴十载,见证了《经济研究》中的“高被引”

利用tushare获取股票数据

关于我们


微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

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

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

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