RANKは、文字の基礎となるASCII数値を提供します。したがって、A = 65、B = 66、Z = 90、a = 97、z=122です。
したがって、これは機能するはずです(大文字の値のみが必要な場合、A以外の値は異なりません)。
data test;
charval='CAB';
do _t=1 to length(Charval);
numval=sum(numval,rank(char(upcase(charval),_t))-64);
end;
put _all_;
run;
別のオプション(以下のコメントに基づく)は、文字と値の関係を使用して情報を作成することです。私のループは各文字AからZを繰り返し、各文字に必要な値をラベルとして配置できます(1、2、3、4を配置するだけですが、label =はそれを変更します)。
data fmts;
retain fmtname 'CHARNUM' type 'i';
do _t=65 to 90;
start=byte(_t); *the character, so byte(65)='A';
label=_t-64; *the resulting number;
output;
end;
run;
proc format cntlin=fmts;
quit;
data test;
charval='CAB';
do _t=1 to length(Charval);
numval=sum(numval,input(char(upcase(charval),_t),CHARNUM.));
end;
put _all_;
run;
最後に、これを同じデータステップで作成できるようにする場合は、ハッシュテーブルで関係を作成し、結果を検索できます。必要に応じて説明できますが、文字とそのコードの関係を定義するという観点から、あなたがやりたいことのより詳細な例を見たいと思います。
中間値を確認する必要がある場合は、ループにCAT関数を挿入することで確認できます。CATXをお勧めします。
data test;
charval='CAB';
format intermed $100.;
do _t=1 to length(Charval);
numval=sum(numval,input(char(upcase(charval),_t),CHARNUM.));
intermed=catx('|',intermed,input(char(upcase(charval),_t),CHARNUM.)); *or the RANK portion from earlier;
end;
put _all_;
run;
それはあなたに与えるでしょう3|1|2
、そしてあなたはそれからSCANを介して数学をすることができます:
do _t = 1 to countc(intermed,'|')+1;
numval2 = sum(numval2,scan(intermed,_t,'|'));
end;