2015年6月29日月曜日

DS2プロシジャ入門4:データ型①


DS2プロシジャには沢山のデータ型が用意されています。
詳細は 「sas ds2 data types」 などでググって出てくる海外SAS社の解説ページをご覧ください。

ここでは一部紹介するに留めます。


とりあえず、、

文字変数は「CHAR」、数値変数は「DOUBLE」という型が、いままでSASで使ってた文字型・数値型と同等なので、まずこの2つを覚えましょう。

CHAR と DOUBLE を宣言する構文
 dcl  char(長さ ) 変数名 ;
 dcl  double       変数名 ;

ちなみに 「dcl double VAR1 VAR2 VAR3;」 というように複数の変数をいっぺんに定義することも出来ます。


クオーテーションには注意。

以下で、変数VAR1 に'aa' という値を入れたいとします。

proc ds2;
  data _DT1 (overwrite=yes);

      dcl char(10) VAR1;
      method init();
          VAR1="aa";
      end;
   
  enddata;
  run;
quit;

ログ
WARNING: 行 74: 参照変数 aa は宣言されていません。タイプ double
のグローバル変数として作成しています。

WARNINGが出てしまいます。
問題は、プログラム青字 「VAR1="aa"」 です。

実はDS2プロシジャでは、文字をダブルクオーテーションで囲むと、識別子とみなします。
(識別子?って感じですが、要はここでは変数名として見なされているって事です)

よって "aa" は変数aaと解釈されてしまい、「そんな変数ないんだけど、ちゃんと宣言しろ」と注意されてしまったわけです。

解決策は簡単で、シングルクオーテーションで囲めば値と見なしてくれます。

  VAR1='aa';


マクロとクオーテーション

以下で、変数VAR1 にマクロ変数の値 'aa' を入れたいとします。

%let MACVAR=aa;

proc ds2;
  data DT1 (overwrite=yes);

     dcl char(10) VAR1;
     method init();
         VAR1 = "&MACVAR";
     end;

  enddata;
  run;
quit;

ログ
WARNING: 行 76: 参照変数 aa は宣言されていません。タイプ double
のグローバル変数として作成しています。

プログラム青字部分の "&MACVAR" が展開され、"aa" となります。
ダブルクオーテーションで囲んでるため、やはり変数名として判断されWARNINGが出てしまいます。
かといって、 '&MACVAR' とシングルクオーテーションで囲ってしまうと「&MACVAR」という値として解釈されて、マクロ変数として展開してくれません。


そこで、%TSLITマクロ関数の出番。
このマクロ関数はシングルクオーテーションの付与と、マクロ変数の展開をしてくれます

  VAR1 = %tslit( &MACVAR );

0 件のコメント:

コメントを投稿