从sas中的字符值创建数值

时间:2013-04-11 07:31:07

标签: sas numeric

我希望转换像" 13232C"到数值。也许为A到Z分配值1到26.然后新代码将是" 132323"。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

Keith的解决方案可能更适合大多数用途,但我不禁将此视为使用PROC FCMP(功能编译)的好机会。这只适用于只有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;

我也将它作为一个角色归还,但这并不重要 - 如果您愿意,可以将其作为数字返回(我在原始问题中看到了“”)。