這是在FB社團被問到的題目,『如何將全形英文字轉成半形英文字』。
在SAS沒有函數能完成類似MS WORD中的功能鍵。
因此就必須使用其他方法來解決這個問題,最簡單也可能是已知最正確的方法就是將全形字「取代」成半形字。
依慣例先建立一個練習資料檔吧。
【程式1】
data a;
input text $;
datalines;
1A
2A
1B
2B
1d
2d
12
22
18
28
;
在資料中,第1,3,5,7,9筆的英文字為全形。
如果先使用 TRANSLATE 來處理這個問題看看。
【程式2】
data b;
set a;
%let tolist=AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789;
%let fromlist=AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789; format T_text $8. ;
T_text=TRANSLATE(text,"&tolist", "&fromlist");
run;
使用 TRANSLATE 的結果如下圖,其結果很明顯是有誤的。
要瞭解這個錯誤,要先知道全形字為「雙位元」的字,而 TRANSLATE 在運作時是以單位元來處理,因此才會產生錯誤。
所以這時要將函數換成K系列的函數,KTRANSLATE 終於上場了。不多說,馬上使用看看,就知道差別在哪裡了。
data c;
set a;
%let tolist=AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789;
%let fromlist=AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789; format K_text T_text $8. ;
K_text=KTRANSLATE(text,"&tolist", "&fromlist");
T_text=TRANSLATE(text,"&tolist", "&fromlist");
run;
正確的結果於K_text變項
沒有留言:
張貼留言