2015年7月14日火曜日

DS2プロシジャ入門5:データ型②


詳細は割愛して、押さえておくべきポイントに焦点を当てたいと思います。
色んなデータ型が用意されてますが、よくマニュアルを読まないと気づきにくい落とし穴もあるのでご注意ください!


DECIMAL型

「DOUBLE」では扱えない桁の数値を利用できます。

DECIMAL を宣言する構文
 dcl  decimal ( 全体の桁数 , 小数部分の桁数 )  変数名 ;


※ 「全体の桁数 」は整数と小数を合わせた桁数を指定します。

たとえば 「dcl decimal (5,2)」 と宣言すれば、整数部分は3ケタ、小数部分は2ケタの数値を表すことができます。
この時 「1234.56」 とか宣言以上の桁がある値を入れたらダメなのでご注意してください。


ポイント①

桁の多い数値は、その数値の末尾に「n」を付ける必要があります。
以下の例をご覧ください。
proc ds2;
data DT1 (overwrite=yes);

    dcl decimal(16,6) VAR1 VAR2;

    method init();
        VAR1=1111111111.111112;
        VAR2=1111111111.111112n;
        put VAR1=;
        put VAR2=;
    end;

enddata;
run;
quit;

ログ
 VAR1=1111111111.111100
 VAR2=1111111111.111112

VAR1とVAR2には同じ値を代入しているはずなのに、ログを見るとVAR1の方は切られちゃってますね。
一方末尾に「n」を付けたVAR2は正しく値が入ってます。


ポイント②

上記プログラムの実行ログをよくよく見てみると、以下のようなメッセージが表示されているはずです。

BASE driver, creation of a DECIMAL column has been requested, but is not supported by the BASE driver. A DOUBLE PRECISION column has been created instead.

これは結果をSASデータセット化する際、、DS2プロシジャでしか扱えない型について、通常のSAS上でも扱える型に置き換える旨の脅しメッセージ(だと思います)。

試しに、先ほど作ったデータセットの中身をデータステップでログに出力してみます。
data _NULL_;
  format VAR1 VAR2 best32.;
  set DT1;
  put (VAR:)(=/);
run;

ログ
 VAR1=1111111111.1111
 VAR2=1111111111.11111

VAR2の値が無慈悲にも最後切れちゃってますね。
型が置き換えられた影響です。

どうしようもないので、今後の解説では通常のSAS上で扱える DOUBLE と CHAR のみを用いることにします。


DS2プロシジャ入門記事

1: 基本構文
: 変数の宣言
3: 変数属性と配列の定義
4: データ型①
5: データ型②

0 件のコメント:

コメントを投稿