2013-04-11 62 views

回答

4

如果代碼中只有1個字母,則此代碼將可用。如果還有更多,那麼你將需要掃描每一個來獲得價值。我通過從ASCII值(A = 65)中減去64來計算字母值(1-26),確保在必要時將字母轉換爲大寫。我也認爲,這封信總是出現在字符串的結尾

data have; 
input code $; 
datalines; 
132323C 
24578D 
5147896G 
; 
run; 

data want; 
set have; 
new_code=input(cats(compress(code,,'dk'),rank(compress(upcase(code),,'ak'))-64),best12.); 
run; 
+0

我應該補充一點,如果您需要引用從字母計算出的數字,您可能需要將新變量保留爲字符。這隻有當你的原始字符串是固定長度時纔可能,在我的例子中我使用了可變長度。希望我已經給你足夠的方法來爲你的目的進行修改。 – Longfish 2013-04-11 10:39:25

+0

不錯的解決方案。十分優雅。 – itzy 2013-04-11 14:54:51

+0

此代碼完美工作。非常感謝你 – user2269241 2014-03-14 10:32:37

0

Keith的解決方案可能是大多數使用更好,但我不禁看到這是一個很好的機會與PROC鈣鎂磷肥玩(函數編譯)。這在您只有A-I的情況下效果很好;從J開始它將不起作用,因爲我只允許單個角色的空間。如果它可以有2位數字,那麼FCMP需要改變,以做Keith的解決方案。

proc fcmp outlib=work.funcs.trial; 
function cton(charvar $) $; 
    do n = 1 to length(charvar); 
    if 48 le rank(char(charvar,n)) le 57 then ; 
    else substr(charvar,n,1) = put(rank(upcase(char(charvar,n)))-64,1.); 
    put charvar; 
    end; 
return (charvar); 
endsub; 

quit; 
options cmplib=work.funcs; 

data test; 
x="23456CAB"; 
y = cton(x); 
put x= y=; 
run; 

我也回擊一個角色,但是這並不重要 - 你可以返回它作爲一個數字,如果你喜歡(我在原來的問題看到了「」)。