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プロシジャでは、文字をダブルクオーテーションで囲むと、識別子とみなします。
問題は、プログラム青字 「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 件のコメント:
コメントを投稿