在SAS中如何解决中文乱码问题
在日常的数据分析处理工作中,不可避免的经常会和中文字符串打交道。如果数据中有乱码,该如何处理?...
在日常工作中,使用SAS进行数据处理是很正常的事情,不可避免的经常会和中文字符串打交道。不知道各位在使用EG的过程中,打开数据集查看数据的时候,有没有遇到过以下问题?
(虽然我也只是偶尔遇到,但已经被折磨好几年!)
SAS Enterprise Guide 5.1
SAS Enterprise Guide 6.1
SAS Enterprise Guide 7.1
不同的版本提示的错误形式不完全一样,但出现的原因却是一模一样的(下面有情景再现的过程)。仔细查看,不难发现真正的错误信息都是一样的,主要是:
“Failed to transcode data from U_EUC_CN_CE to U_UTF8_CE encoding because it contained characters wihch are not supported by your SAS session encoding. Please review your encoding= and locale= SAS system options to ensure that they can accommodate tje data that you want to process.”
这段话是什么意思呢?其实就是上面EG 7.1版本的错误提示的中文描述。简而言之,就是告诉你数据中有无法处理的编码数据。
出现这个问题,仅仅是不能打开查看数据吗?不是!如果出现这个问题,意味着你基本不能用这个数据进行后续的分析了。只要进行的处理或者分析涉及到该有问题的字段就会提示上面的这个错误信息,阴魂不散,挥之不去。
最简单粗暴的办法就是不用图形化的工具EG,用最经典的Base工具就没有这个问题了,一劳永逸。而有时候没法不用EG的时候怎么办?比如我是用EG连着SAS服务器进行处理的,该怎么办?
至于为什么EG会出现这个问题,而Base界面没有这个问题呢?主要是因为软件的底层设计而导致的,这个编码问题说大不大,说小不小;忽略了就可以正常使用,如果不忽略,那么它就是一个问题。下面会对这个问题进行再现,剖析其原因,你就明白了。
当我第一次遇到这个问题的时候,想不明白,就去google搜索错误信息,找到的文档资料基本都是说编码或者地区的设置问题。意思就是说数据的编码跟现有的SAS环境的编码不一致,也就是上面错误信息当中提示的。要你通过option encoding= locale=; 修改到正确的编码及地区,就可以解决问题了。可是我的环境是没有任何问题的,数据也是同样的环境生成的。经过了几次的研究,最后搞清楚了,这个问题是由于中文被截断而导致的。
(下文需要有一定的IT基础知识,不懂的童鞋,可度娘有关数据存储、数据编码方面的知识;只要大概明白数据是怎么在计算机中存储及还原的就OK了)
具体来说:在GBK编码中(SAS中文的默认编码方式),一个汉字是占两个字节。由于各种原因,在存储数据的时候某个汉字只存储了其中的一个字节,另一个字节丢失了。那么就导致这个字节没法还原,不知道是什么东西(因为少一个字节的信息)。所以才会有上面的错误提示:数据中包含当前SAS会话编码不支持的编码数据。
我们可以用下面简单的程序来再现这个问题(在EG中运行这段程序,在Base中是可以正常查看数据的,但只显示“你好”。)
data test;
length str $ 5;
str="你好啊";
run;
当运行完这段程序,打开test数据集查看的时候,就出现上面的错误信息:
“你好啊”三个汉字需要6个字节去存储,而str事先定义了长度为5个字节,这就导致只存储了2.5个汉字;而存储的这0.5个汉字信息由于没法显示,所以才导致上面提示的编码问题。
进一步来看看底层的信息(十六进制编码):
data _null_;
length str1 $ 5 str2 $ 6;
str1="你好啊";
str2="你好啊";
put str1 $hex12.;
put str2 $hex12.;
run;
日志信息:
从上面的日志信息可以看到,就是因为少存储了“A1”这个字节信息,导致“B0”这个字节无法解码,无法正常显示。
额外补充(懂的人就此略过):
汉字“你”的GBK编码,十进制为50403,十六进制为C4E3
汉字“好”的GBK编码,十进制为47811,十六进制为BAC3
汉字“啊”的GBK编码,十进制为45217,十六进制为B0A1有人可能会想:英文字符就是一个字节存储的,一个字节也能显示出来;为什么这里的一个字节就出问题了?
这就涉及到编码范围的问题了,英文字符是ASCII编码。通过查看标准的ASCII码表就可发现,最大的编码十进制为127,十六进制为7F;而B0是远大于7F的,超出了ASCII的编码范围,因此无法显示。
如果你够仔细,你就会发现,其实在EG的错误提示中,就包含了这段出问题的十六进制编码信息:c4 e3 ba c3 b0。
问题的原因既然搞清楚了,那么如何解决的思路就很清晰了。说白了就是找出字符串中有中文截断的地方,然后将这半个汉字的信息直接删除就没问题了。
以前面生成的test数据为例,str的最后一个字节包含了半个汉字信息,只要将最后一个字节删掉就OK了。
data test2;
set test;
code_before=put(str,$hex10.);
str=substr(str,1,4);
code_after=put(str,$hex10.);
run;
如上所示,经过处理后,可以正常的显示数据了。
(注:code_after中最后一个字节“20”是空格的十六进制编码。字符变量中多余的字节,SAS默认用空格来填充。因此“你好”两个汉字占4个字节,剩余一个字节就是空格。)
虽然解决方法很清晰,想起来也很简单,但要实现起来还不是那么容易。上面的情况是特例,我们明显知道在哪个地方有问题,直接处理就OK。
但通常情况下,我们是不知道在字符串的具体哪个地方有截断,也不知道是哪些观测有截断的问题;而且每条观测中被截断的位置也不一定都一样,甚至也不知道截断的数据后面有没有其他字符数据。面对这么多不确定,该如何解决?
下面,提供一种思路,有兴趣的童鞋可以自由发挥,去解决这个问题。
首先,GBK编码方案中,总体的编码是有范围的,从8140~FEFE。其中首字节在81~FE之间,尾字节在40~FE之间,剔除xx7F一条线;总计23940个码位,共收入21886个汉字和图形符号,其中汉字21003个,图形符号883个。
其次,ASCII编码的范围是从00~7F,共计128个码位,收入大小写英文字母、数字、符号、及特殊控制字符。其中可显示的编码范围为20~7E。
基于上面的这些信息,就可以从十六进制编码入手,逐个去判断识别,进而找到存在截断的位置,然后将其处理掉。记得要考虑以下多种情况:数据分析师培训
截断情况出现在字符串末尾
截断情况出现在字符串中间,且后面紧跟英文字母
截断情况出现在字符串中间,且后面紧跟完整的汉字
推荐学习书籍
《CDA一级教材》适合CDA一级考生备考,也适合业务及数据分析岗位的从业者提升自我。完整电子版已上线CDA网校,累计已有10万+在读~
免费加入阅读:https://edu.cda.cn/goods/show/3151?targetId=5147&preview=0
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
以下的文章内容来源于刘静老师的专栏,如果您想阅读专栏《10大业务分析模型突破业务瓶颈》,点击下方链接 https://edu.cda.cn/g ...
2025-04-30CDA持证人简介: 邱立峰 CDA 数据分析师二级持证人,数字化转型专家,数据治理专家,高级数据分析师,拥有丰富的行业经验。 ...
2025-04-29CDA持证人简介: 程靖 CDA会员大咖,畅销书《小白学产品》作者,13年顶级互联网公司产品经理相关经验,曾在百度,美团,阿里等 ...
2025-04-28CDA持证人简介: 居瑜 ,CDA一级持证人国企财务经理,13年财务管理运营经验,在数据分析就业和实践经验方面有着丰富的积累和经 ...
2025-04-27数据分析在当今信息时代发挥着重要作用。单因素方差分析(One-Way ANOVA)是一种关键的统计方法,用于比较三个或更多独立样本组 ...
2025-04-25CDA持证人简介: 居瑜 ,CDA一级持证人国企财务经理,13年财务管理运营经验,在数据分析就业和实践经验方面有着丰富的积累和经 ...
2025-04-25在当今数字化时代,数据分析师的重要性与日俱增。但许多人在踏上这条职业道路时,往往充满疑惑: 如何成为一名数据分析师?成为 ...
2025-04-24以下的文章内容来源于刘静老师的专栏,如果您想阅读专栏《刘静:10大业务分析模型突破业务瓶颈》,点击下方链接 https://edu.cda ...
2025-04-23大咖简介: 刘凯,CDA大咖汇特邀讲师,DAMA中国分会理事,香港金管局特聘数据管理专家,拥有丰富的行业经验。本文将从数据要素 ...
2025-04-22CDA持证人简介 刘伟,美国 NAU 大学计算机信息技术硕士, CDA数据分析师三级持证人,现任职于江苏宝应农商银行数据治理岗。 学 ...
2025-04-21持证人简介:贺渲雯 ,CDA 数据分析师一级持证人,互联网行业数据分析师 今天我将为大家带来一个关于用户私域用户质量数据分析 ...
2025-04-18一、CDA持证人介绍 在数字化浪潮席卷商业领域的当下,数据分析已成为企业发展的关键驱动力。为助力大家深入了解数据分析在电商行 ...
2025-04-17CDA持证人简介:居瑜 ,CDA一级持证人,国企财务经理,13年财务管理运营经验,在数据分析实践方面积累了丰富的行业经验。 一、 ...
2025-04-16持证人简介: CDA持证人刘凌峰,CDA L1持证人,微软认证讲师(MCT)金山办公最有价值专家(KVP),工信部高级项目管理师,拥有 ...
2025-04-15持证人简介:CDA持证人黄葛英,ICF国际教练联盟认证教练,前字节跳动销售主管,拥有丰富的行业经验。在实际生活中,我们可能会 ...
2025-04-14在 Python 编程学习与实践中,Anaconda 是一款极为重要的工具。它作为一个开源的 Python 发行版本,集成了众多常用的科学计算库 ...
2025-04-14随着大数据时代的深入发展,数据运营成为企业不可或缺的岗位之一。这个职位的核心是通过收集、整理和分析数据,帮助企业做出科 ...
2025-04-11持证人简介:CDA持证人黄葛英,ICF国际教练联盟认证教练,前字节跳动销售主管,拥有丰富的行业经验。 本次分享我将以教培行业为 ...
2025-04-11近日《2025中国城市长租市场发展蓝皮书》(下称《蓝皮书》)正式发布。《蓝皮书》指出,当前我国城市住房正经历从“增量扩张”向 ...
2025-04-10在数字化时代的浪潮中,数据已经成为企业决策和运营的核心。每一位客户,每一次交易,都承载着丰富的信息和价值。 如何在海量客 ...
2025-04-09