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