2014年10月8日水曜日

DO i = 'A' to 'Z' ;

ちょっとした遊びです。

タイトルにあるような、アルファベット"A"から"Z"までループをまわすみたいな事って出来ないんですよね。
なので、色々工夫して実現してみたいと思います。

前置き
今回紹介するBYTE, COLLATE関数は、Windows版のSAS環境で試した結果を示しています。
環境によってASCII照合順序やEBCDIC照合順序の違いにより、今回示した結果にならないことがあります。
リファレンスや環境の確認を行ってください。




*** DO i = 'A' to 'Z'のような動作を実現 ;
data _NULL_;
   do i = 65 to 90 ;
       A = byte(i) ;
       put A ;
   end;
run;

ログ
A
B
C
D
・・・中略・・・
X
Y
Z

Windows環境にて、BYTE関数はASCII照合順序に該当する文字を返してくれます。
要は、数字と文字が対応してて、65は「A」、66は「B」、、、、90は「Z」の順であらわされる。
これをうまくDOループと組み合わせてアルファベットを順番に取得しています。



*** 'ABC・・・XYZ'という文字列を取得する ;
data _NULL_;
  A = collate(65, 90) ;
  put A;
run;

ログ
ABCDEFGHIJKLMNOPQRSTUVWXYZ


Windows環境にて、COLLATE(開始値, 終了値)で、開始値から終了値までの該当するASCII照合順序の文字を連結して返してくれます。



*** %DO i = A %to Zのような動作を実現 ;
%macro MAC;
   %do i = 65 %to 90;

       data  %sysfunc( byte(&i) ) ;
          A=1;
       run;

   %end;
%mend;
%MAC;


データステップ外でも関数を使用できるようにする%SYSFUNC関数でBYTE関数を使い、まるで「%DO i = A %to Z」と書いてるかのような動作を実現。
上の例では、AからZまでのデータセットを作成しています。


0 件のコメント:

コメントを投稿