
在SAS中如何解決中文亂碼問(wèn)題
在日常的數(shù)據(jù)分析處理工作中,不可避免的經(jīng)常會(huì)和中文字符串打交道。如果數(shù)據(jù)中有亂碼,該如何處理?...
在日常工作中,使用SAS進(jìn)行數(shù)據(jù)處理是很正常的事情,不可避免的經(jīng)常會(huì)和中文字符串打交道。不知道各位在使用EG的過(guò)程中,打開(kāi)數(shù)據(jù)集查看數(shù)據(jù)的時(shí)候,有沒(méi)有遇到過(guò)以下問(wèn)題?
(雖然我也只是偶爾遇到,但已經(jīng)被折磨好幾年?。?
SAS Enterprise Guide 5.1
SAS Enterprise Guide 6.1
SAS Enterprise Guide 7.1
不同的版本提示的錯(cuò)誤形式不完全一樣,但出現(xiàn)的原因卻是一模一樣的(下面有情景再現(xiàn)的過(guò)程)。仔細(xì)查看,不難發(fā)現(xiàn)真正的錯(cuò)誤信息都是一樣的,主要是:
“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.”
這段話是什么意思呢?其實(shí)就是上面EG 7.1版本的錯(cuò)誤提示的中文描述。簡(jiǎn)而言之,就是告訴你數(shù)據(jù)中有無(wú)法處理的編碼數(shù)據(jù)。
出現(xiàn)這個(gè)問(wèn)題,僅僅是不能打開(kāi)查看數(shù)據(jù)嗎?不是!如果出現(xiàn)這個(gè)問(wèn)題,意味著你基本不能用這個(gè)數(shù)據(jù)進(jìn)行后續(xù)的分析了。只要進(jìn)行的處理或者分析涉及到該有問(wèn)題的字段就會(huì)提示上面的這個(gè)錯(cuò)誤信息,陰魂不散,揮之不去。
最簡(jiǎn)單粗暴的辦法就是不用圖形化的工具EG,用最經(jīng)典的Base工具就沒(méi)有這個(gè)問(wèn)題了,一勞永逸。而有時(shí)候沒(méi)法不用EG的時(shí)候怎么辦?比如我是用EG連著SAS服務(wù)器進(jìn)行處理的,該怎么辦?
至于為什么EG會(huì)出現(xiàn)這個(gè)問(wèn)題,而B(niǎo)ase界面沒(méi)有這個(gè)問(wèn)題呢?主要是因?yàn)檐浖牡讓釉O(shè)計(jì)而導(dǎo)致的,這個(gè)編碼問(wèn)題說(shuō)大不大,說(shuō)小不??;忽略了就可以正常使用,如果不忽略,那么它就是一個(gè)問(wèn)題。下面會(huì)對(duì)這個(gè)問(wèn)題進(jìn)行再現(xiàn),剖析其原因,你就明白了。
當(dāng)我第一次遇到這個(gè)問(wèn)題的時(shí)候,想不明白,就去google搜索錯(cuò)誤信息,找到的文檔資料基本都是說(shuō)編碼或者地區(qū)的設(shè)置問(wèn)題。意思就是說(shuō)數(shù)據(jù)的編碼跟現(xiàn)有的SAS環(huán)境的編碼不一致,也就是上面錯(cuò)誤信息當(dāng)中提示的。要你通過(guò)option encoding= locale=; 修改到正確的編碼及地區(qū),就可以解決問(wèn)題了??墒俏业沫h(huán)境是沒(méi)有任何問(wèn)題的,數(shù)據(jù)也是同樣的環(huán)境生成的。經(jīng)過(guò)了幾次的研究,最后搞清楚了,這個(gè)問(wèn)題是由于中文被截?cái)喽鴮?dǎo)致的。
(下文需要有一定的IT基礎(chǔ)知識(shí),不懂的童鞋,可度娘有關(guān)數(shù)據(jù)存儲(chǔ)、數(shù)據(jù)編碼方面的知識(shí);只要大概明白數(shù)據(jù)是怎么在計(jì)算機(jī)中存儲(chǔ)及還原的就OK了)
具體來(lái)說(shuō):在GBK編碼中(SAS中文的默認(rèn)編碼方式),一個(gè)漢字是占兩個(gè)字節(jié)。由于各種原因,在存儲(chǔ)數(shù)據(jù)的時(shí)候某個(gè)漢字只存儲(chǔ)了其中的一個(gè)字節(jié),另一個(gè)字節(jié)丟失了。那么就導(dǎo)致這個(gè)字節(jié)沒(méi)法還原,不知道是什么東西(因?yàn)樯僖粋€(gè)字節(jié)的信息)。所以才會(huì)有上面的錯(cuò)誤提示:數(shù)據(jù)中包含當(dāng)前SAS會(huì)話編碼不支持的編碼數(shù)據(jù)。
我們可以用下面簡(jiǎn)單的程序來(lái)再現(xiàn)這個(gè)問(wèn)題(在EG中運(yùn)行這段程序,在Base中是可以正常查看數(shù)據(jù)的,但只顯示“你好”。)
data test;
length str $ 5;
str="你好啊";
run;
當(dāng)運(yùn)行完這段程序,打開(kāi)test數(shù)據(jù)集查看的時(shí)候,就出現(xiàn)上面的錯(cuò)誤信息:
“你好啊”三個(gè)漢字需要6個(gè)字節(jié)去存儲(chǔ),而str事先定義了長(zhǎng)度為5個(gè)字節(jié),這就導(dǎo)致只存儲(chǔ)了2.5個(gè)漢字;而存儲(chǔ)的這0.5個(gè)漢字信息由于沒(méi)法顯示,所以才導(dǎo)致上面提示的編碼問(wèn)題。
進(jìn)一步來(lái)看看底層的信息(十六進(jìn)制編碼):
data _null_;
length str1 $ 5 str2 $ 6;
str1="你好啊";
str2="你好啊";
put str1 $hex12.;
put str2 $hex12.;
run;
日志信息:
從上面的日志信息可以看到,就是因?yàn)樯俅鎯?chǔ)了“A1”這個(gè)字節(jié)信息,導(dǎo)致“B0”這個(gè)字節(jié)無(wú)法解碼,無(wú)法正常顯示。
額外補(bǔ)充(懂的人就此略過(guò)):
漢字“你”的GBK編碼,十進(jìn)制為50403,十六進(jìn)制為C4E3
漢字“好”的GBK編碼,十進(jìn)制為47811,十六進(jìn)制為BAC3
漢字“啊”的GBK編碼,十進(jìn)制為45217,十六進(jìn)制為B0A1有人可能會(huì)想:英文字符就是一個(gè)字節(jié)存儲(chǔ)的,一個(gè)字節(jié)也能顯示出來(lái);為什么這里的一個(gè)字節(jié)就出問(wèn)題了?
這就涉及到編碼范圍的問(wèn)題了,英文字符是ASCII編碼。通過(guò)查看標(biāo)準(zhǔn)的ASCII碼表就可發(fā)現(xiàn),最大的編碼十進(jìn)制為127,十六進(jìn)制為7F;而B(niǎo)0是遠(yuǎn)大于7F的,超出了ASCII的編碼范圍,因此無(wú)法顯示。
如果你夠仔細(xì),你就會(huì)發(fā)現(xiàn),其實(shí)在EG的錯(cuò)誤提示中,就包含了這段出問(wèn)題的十六進(jìn)制編碼信息:c4 e3 ba c3 b0。
問(wèn)題的原因既然搞清楚了,那么如何解決的思路就很清晰了。說(shuō)白了就是找出字符串中有中文截?cái)嗟牡胤?,然后將這半個(gè)漢字的信息直接刪除就沒(méi)問(wèn)題了。
以前面生成的test數(shù)據(jù)為例,str的最后一個(gè)字節(jié)包含了半個(gè)漢字信息,只要將最后一個(gè)字節(jié)刪掉就OK了。
data test2;
set test;
code_before=put(str,$hex10.);
str=substr(str,1,4);
code_after=put(str,$hex10.);
run;
如上所示,經(jīng)過(guò)處理后,可以正常的顯示數(shù)據(jù)了。
(注:code_after中最后一個(gè)字節(jié)“20”是空格的十六進(jìn)制編碼。字符變量中多余的字節(jié),SAS默認(rèn)用空格來(lái)填充。因此“你好”兩個(gè)漢字占4個(gè)字節(jié),剩余一個(gè)字節(jié)就是空格。)
雖然解決方法很清晰,想起來(lái)也很簡(jiǎn)單,但要實(shí)現(xiàn)起來(lái)還不是那么容易。上面的情況是特例,我們明顯知道在哪個(gè)地方有問(wèn)題,直接處理就OK。
但通常情況下,我們是不知道在字符串的具體哪個(gè)地方有截?cái)啵膊恢朗悄男┯^測(cè)有截?cái)嗟膯?wèn)題;而且每條觀測(cè)中被截?cái)嗟奈恢靡膊灰欢ǘ家粯樱踔烈膊恢澜財(cái)嗟臄?shù)據(jù)后面有沒(méi)有其他字符數(shù)據(jù)。面對(duì)這么多不確定,該如何解決?
下面,提供一種思路,有興趣的童鞋可以自由發(fā)揮,去解決這個(gè)問(wèn)題。
首先,GBK編碼方案中,總體的編碼是有范圍的,從8140~FEFE。其中首字節(jié)在81~FE之間,尾字節(jié)在40~FE之間,剔除xx7F一條線;總計(jì)23940個(gè)碼位,共收入21886個(gè)漢字和圖形符號(hào),其中漢字21003個(gè),圖形符號(hào)883個(gè)。
其次,ASCII編碼的范圍是從00~7F,共計(jì)128個(gè)碼位,收入大小寫(xiě)英文字母、數(shù)字、符號(hào)、及特殊控制字符。其中可顯示的編碼范圍為20~7E。
基于上面的這些信息,就可以從十六進(jìn)制編碼入手,逐個(gè)去判斷識(shí)別,進(jìn)而找到存在截?cái)嗟奈恢茫缓髮⑵涮幚淼?。記得要考慮以下多種情況:數(shù)據(jù)分析師培訓(xùn)
截?cái)嗲闆r出現(xiàn)在字符串末尾
截?cái)嗲闆r出現(xiàn)在字符串中間,且后面緊跟英文字母
截?cái)嗲闆r出現(xiàn)在字符串中間,且后面緊跟完整的漢字
推薦學(xué)習(xí)書(shū)籍
《CDA一級(jí)教材》適合CDA一級(jí)考生備考,也適合業(yè)務(wù)及數(shù)據(jù)分析崗位的從業(yè)者提升自我。完整電子版已上線CDA網(wǎng)校,累計(jì)已有10萬(wàn)+在讀~
免費(fèi)加入閱讀:https://edu.cda.cn/goods/show/3151?targetId=5147&preview=0
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
LSTM 模型輸入長(zhǎng)度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長(zhǎng)序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報(bào)考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計(jì)的實(shí)用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強(qiáng)大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠(chéng)摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實(shí)施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價(jià)值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡(jiǎn)稱 BI)深度融合的時(shí)代,BI ...
2025-07-10SQL 在預(yù)測(cè)分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢(shì)預(yù)判? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代,預(yù)測(cè)分析作為挖掘數(shù)據(jù)潛在價(jià)值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價(jià)值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點(diǎn),而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報(bào)考到取證的全攻略? 在數(shù)字經(jīng)濟(jì)蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭(zhēng)搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢(shì)性檢驗(yàn):捕捉數(shù)據(jù)背后的時(shí)間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢(shì)性檢驗(yàn)如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時(shí)間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時(shí)間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實(shí)戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗(yàn):數(shù)據(jù)趨勢(shì)與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢(shì)變化以及識(shí)別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國(guó)內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對(duì)策略? 長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨(dú)特的門(mén)控機(jī)制,在 ...
2025-07-07統(tǒng)計(jì)學(xué)方法在市場(chǎng)調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場(chǎng)調(diào)研是企業(yè)洞察市場(chǎng)動(dòng)態(tài)、了解消費(fèi)者需求的重要途徑,而統(tǒng)計(jì)學(xué)方法則是市場(chǎng)調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書(shū)考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動(dòng)力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動(dòng)力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開(kāi)啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價(jià)值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03