1

我想将“13232C”之类的代码转换为数值。也许为 A 到 Z 分配值 1 到 26。那么新代码将是“132323”。

4

2 回答 2

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;
于 2013-04-11T09:06:44.303 回答
0

Keith 的解决方案可能更适合大多数用途,但我不禁将其视为使用 PROC FCMP(函数编译)的好机会。这在您只有 AI 的情况下非常有效;从 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;

我也将它作为一个字符返回,但这并不重要——如果你愿意,你可以将它作为一个数字返回(我在原始问题中看到了“”)。

于 2013-04-11T15:25:25.603 回答