2013-04-11 2 views

답변

4

코드에 문자가 하나만있는 경우이 코드가 작동합니다. 그 이상이 있으면 값을 얻기 위해 각각을 스캔해야합니다. 필자는 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

+0

좋은 해결책. 매우 우아합니다. – itzy

+0

이 코드는 완벽하게 작동합니다. 대단히 감사합니다. – user2269241

0

키스의 솔루션은 대부분의 용도에 아마도 더 나은,하지만 난 (PROC FCMP 함께 플레이 할 수있는 좋은 기회로 이것을보고 도울 수 없어요 함수 컴파일). 이것은 A-I 만있는 경우에 잘 작동합니다. J로 시작하면 단일 문자의 공간 만 허용하기 때문에 작동하지 않습니다. 2 자리 숫자를 사용할 수 있다면 키스의 솔루션이 수행하도록 FCMP를 변경해야합니다.

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; 

나는 또한 문자로 반환,하지만 그건 중요하지 않아 - 당신이 선호하는 경우가 숫자로 반환 할 수 (나는 원래의 질문에 ""를 보았다).