查看原文
其他

乱“码”渐欲迷人眼——识破UTF-8与gb2312的障眼法

朱子奇 Stata and Python数据分析 2022-03-15

最近,小伙伴们应该听闻了万科如电视剧一般的“八卦”,每天搞的这个大新闻啊,excited。不过,媒体界向来听风就是雨,其实说来说去,万科无非就是股权的问题呐!很抱歉,小编不是媒体专业人士,但是作为一名Stata学习者想和大家说,“闷声学Stata”才是坠吼的,学好Stata也可以挖“猛料”。所以,今天小编要和大家分享一下在获取万科(000002,SZ)的高管数据中所遇到的问题——如何在数据导入过程中处理UTF-8gb2312的编码。

Stata13版本

一、同花顺(UTF-8)

       1.      进入同花顺主页,通过股票代码“000002”搜索万科A的相关信息,然后找到关于万科A的高管数据。

   其网页链接如下:

http://stockpage.10jqka.com.cn/000002/company/#manager

2.在Stata13中,通过copy命令,达到获取网页源代码的目的,并将其存储为”.txt”文件格式:

clear

set more off

capture mkdir "E:/爬虫俱乐部"

cd "E:/爬虫俱乐部"

cap copy ///

http://stockpage.10jqka.com.cn/000002/company/#manager///

E:/爬虫俱乐部/wanke.txt,replace

       3. 通过insheetimportdelimitinfix三种方式分别导入数据:

a) 方式一: insheet usingwanke.txt,clear

       句法规则:Insheet[varlist]using filename [, options]

   需要注意的是:

       1) 数据间以制表符(Tab分隔)或者以逗号分隔,但不能读取同时使用这两种分隔方法的数据;

       2) 每一个观测值只能占一行;

   3) 第一行可以包含或不包括变量的名字。如果文件的第一行不是变量名,则需要加上选项nonamesStata给变量命名为V1V2等。Tab分隔的文本文件(.txt),逗号分隔的文本文件(.csv)

       b) 方式二: import delimited

  句法规则:importdelimited [using] filename [, import_delimited_options]

       需要注意的是:importdelimit导入的是分隔的文本数据,每一个观测值只能占一行。

   命令如下:

       c)      方式三: infix

       句法规则: infixusing dfilename [if] [in] [, using(filename2) clear]

  需要注意的是:infix读入的是固定格式的数据。命令如下:

       infix strL v 1-300000 using wanke.txt,clear

       4. 打开copy下来的文件,通过ctrl+F搜索“charset=”,显示为UTF-8格式:

       5. 由于”.txt”文件中为”UTF-8”格式,stata13无法对”UTF-8”格式进行识别,因此对于这种格式的文件,stata13如果需要对此转换,过程十分麻烦,所以我们将在后文使用Stata14版本进行操作。

 

二、新浪财经(gb2312)

1.通过新浪财经网来搜索关于万科A的高管数据。其网页链接如下:

http://vip.stock.finance.sina.com.cn/corp/go.php/vCI_CorpManager/stockid/000002.phtml

       2. Stata13软件中通过copy获取网页的源代码,保存为”.txt”文件格式:

clear

set more off

cd "E:/爬虫俱乐部"

cap copy ///

"http://vip.stock.finance.sina.com.cn/corp/go.php/vCI_CorpManager/stockid/000002.phtml"///

E:/爬虫俱乐部/wanke2.txt,replace

       3.导入数据:

a) 方式一: insheet:

insheet using wanke2.txt,clear

   此时出现了多个变量,我们需要对此组合在一起,则我们进一步需要将其结果进行拼接到一起:

gen v=v1+v2+v3+v4+v5+v6+v7+v8+v9+v10+v12

keep v

b) 方式二: import delimited

import delimited using wanke2.txt, clear

       import delimited也出现如上多个变量的结果,我们也需要对其进行重新改善:

gen v=v1+v2+v3+v4+v5+v6+v7+v8+v9+v10+v12

keep v

       c)      方式三:infix

infix strL v 1-300000 using wanke2.txt,clear

format v %100s

4. 打开copy下来的文件,通过ctrl+F搜索“charset=”,显示为格式“gb2312


5.通过以上说明,stata13可以识别”gb2312”的编码文件。


Stata14版本

  一、同花顺(UTF-8)

  1.      进入同花顺主页,通过股票代码“000002”搜索万科A的相关信息,然后找到关于万科A的高管数据。

  其网页链接如下:

http://stockpage.10jqka.com.cn/000002/company/#manager

2.Stata14中,通过copy命令,达到获取网页源代码的目的,并将其存储为”.txt”文件格式:

clear

set more off

capture mkdir "E:/爬虫俱乐部"

cd "E:/爬虫俱乐部"

cap copy ///

“http://stockpage.10jqka.com.cn/000002/company/#manager”///

E:/爬虫俱乐部/wanke.txt,replace      

       3.      打开copy下来的文件,通过ctrl+F搜索“charset=”,显示为UTF-8格式:

       4.  通过insheetimportdelimitinfix三种方式进行数据导入:

       a) 方式一:insheet

       命令如下:

insheet using wanke.txt ,clear

   然后进行组合:

gen v=v1+v2+v3+v4+v5+v6+v7+v8+v9+v10+v11+v12+v13+v14+v15+v16+v20+v22+v23+v25

keep v


       b) 方式二: import delimted

import delimited using wanke.txt,clear

   此时,我们看到这里会出现一群乱码。通过help import delimited,可以发现通过选项encoding转码,便能解决这个问题。命令如下:

import delimited using wanke.txt,encoding(UTF-8) clear


   然后再进行组合:

gen v=v1+v2+v3+v4+v5+v6+v7+v8+v9+v10+v12

keep v


       (c) 方式三: infix

Infix strL v 1-300000 using wanke.txt,clear

format v %100s

二、新浪财经(gb-2312)

1. 通过新浪财经网来搜索关于万科A的高管数据。其网页链接如下:

http://vip.stock.finance.sina.com.cn/corp/go.php/vCI_CorpManager/stockid/000002.phtml

       2. Stata14中,通过copy获取网页的源代码,保存为”.txt”文件格式:

clear

set more off

cd "E:/爬虫俱乐部"

cap copy ///

"http://vip.stock.finance.sina.com.cn/corp/go.php/vCI_CorpManager/stockid/000002.phtml"///

E:/爬虫俱乐部/wanke2.txt,replace


       3. 打开copy下来的文件,通过ctrl+F搜索“charset=”,显示为格式“gb2312


       4. 当继续使用insheetimportimportedinfix三种命令来进行数据导入时,我们会发现如下的问题:

       5. 此时,需要采用unicode进行转码(此处引用来自爬虫俱乐部的前身,数据处理援助中心《识得庐山真面目——unicode命令》一文)。在完成这个命令之前,必须清空数据,并且将文件保持在当前的工作路径。使用help encoding查看转换的编码,用unicode encoding set进行设置,在此我们设置为gb18030,然后进行转码,命令如下:

clear

set more off

cd "E:/爬虫俱乐部"

unicode encoding set gb18030

unicode translate wanke2.txt,transutf8


       在进行unicode tranlate之后,会生成一个名为“bak.stunicode”的新文件夹,里面保存了文件在转码前的备份:


       这样会使得在该路径下的”wanke2.txt”的文件不能再进行转码,倘若我们再对这个覆盖过后的文件"wanke2.txt"进行转码,需要先把这个文件夹删除,或者用unicode erasebackups这个命令,并加上badidea选项:

unicode erasebackups,badidea


       这样,就又可以对”wanke2.txt”文件进行转码。然后,我们对转码过后的”wanke2.txt”文件进行导入。

   a)      方式一:insheet using wanke2.txt,clear


       然后对于多个变量进行处理:

gen v=v1+v2+v3+v4+v5+v6+v7+v8+v9+v10+v12

keep v


       b)     方式二:import delimited using wanke2.txt,encoding(gb2312) clear

   是对这多个变量进行处理:

gen v=v1+v2+v3+v4+v5+v6+v7+v8+v9+v10+v12

keep v

       c)      方式三:infix strL v 1-300000 using wanke2.txt,clear

format v %100s

Tips

1. infixinsheetimportdelimited导入结果我们发现:Insheetimport delimited导入的结果会出现多个变量,而infix导入的结果中只会出现一个变量,所以infix在数据处理过程中更加便利。因此,在对于”.txt”格式的文件进行导入时,我们会优先采用infix命令。

2. import delimited命令是有一定缺陷的。比如小编在对平安银行(000001)的高管数据的获取过程中发现,在1282个观测值中出现了乱码的问题。

clear

set more off

cd E:/

cap copy ///

"http://vip.stock.finance.sina.com.cn/corp/go.php/vCI_CorpManager/stockid/000001.phtml"///

 E:/temp1.txt,replace

import delimitedtemp1.txt,encoding("gb2312")clear


   但是在用unicode转码后,用insheet或者infix导入的过程中则没有出现这样的问题。

clear

set more off

cd E:/

unicode encoding set gb18030

unicode translate temp1.txt,transutf8

insheet using temp1.txt,clear


       这说明import delimited在导入数据的过程中是有缺陷的。

3.实际上,在Stata13中,系统能够识别gb-2312格式,我们不需要对其进行转码处理。对于UTF-8格式,Stata13则无法较好地解决,但Stata14能轻而易举地处理乱码的问题。如果各位觉得unicode转换稍显麻烦,有一种懒人办法就是:我们在获取源代码的数据后,首先查看文本文件,查找一下”charset=”,当charset=gb2312时,我们选择软件Stata13,当charset=UTF-8时,我们则选择Stata14。不过,对于小编这种已经被乱码折磨得感觉身体被掏空的人来说,Stata14在字符识别与处理以及正则表达式的功能上,相较于Stata13有了“质”的飞跃,比如,对于如下的同一组简单的代码,Stata13中会出现错误,而在Stata14中则不会:

clear

set more off

set obs 10

gen 爬虫俱乐部=1

stata13的结果如下:


Stata14的结果如下:

   所以, Stata的使用,不仅要靠自我灵活运用,也要考虑到升级的进程。小编在这里斗胆推荐小伙伴们使用Stata14,当然你们自己的想法也是很重要滴。今天小编是不是又帮到了大家呢?哈哈,“爬虫俱乐部”专注解决Stata各种疑难杂症,关注后可延年益寿哒!小伙伴们快到碗里来!

我们团队原来的微信公众号是“数据处理援助中心”,现在正式搬家到“爬虫俱乐部”,欢迎关注。新的公众号开始,我们推出有问必答栏目,对您提出的问题,我们会尽力回答,并通过推文的形式进行发布。我们也欢迎各位粉丝向公众号投稿。

(编辑 @徐苾雯 @薛原)

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

投稿邮箱:xueyuan19920310@163.com

投稿要求

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

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

注意事项

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

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

3)如果大家遇到关于stata处理分析数据的问题,也可以给该邮箱写邮件,邮件名称为“提问”+“问题名称或者关键词”,我们会在后期的推文里给予解答。


长按二维码关注公众号

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

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