2013年8月5日

【SAS 小技巧】全形英文數字轉為半形

 

這是在FB社團被問到的題目,『如何將全形英文字轉成半形英文字』。

在SAS沒有函數能完成類似MS WORD中的功能鍵。

image

因此就必須使用其他方法來解決這個問題,最簡單也可能是已知最正確的方法就是將全形字「取代」成半形字。

依慣例先建立一個練習資料檔吧。

【程式1】

data a;
input text $;
datalines;
1A
2A
1B
2B
1d
2d
12
22
18
28
;

在資料中,第1,3,5,7,9筆的英文字為全形。

image

如果先使用 TRANSLATE 來處理這個問題看看。

【程式2】

data b;
set a;
%let tolist=AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789;
%let fromlist=AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789;

format T_text  $8. ;
T_text=TRANSLATE(text,"&tolist", "&fromlist");
run;

使用 TRANSLATE 的結果如下圖,其結果很明顯是有誤的。

image

要瞭解這個錯誤,要先知道全形字為「雙位元」的字,而 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變項

image

沒有留言:

張貼留言