以下は、CALL VNEXTを使って変数定義をデータセットに書き出す例です。
* サンプルデータ作成 ; data DT1; input A1 A2 A3; cards; 1 1 2 2 1 2 3 1 2 ; |
* 変数定義をデータセットに書き出す ; data DT2; if 0 then set DT1; * ① ; length _NAME $40. _TYPE $1.; * ② ; do until ( _NAME="" ); * ③ ; call vnext( _NAME, _TYPE, _LENGTH ); * ⓸ ; if _NAME ^="" then output; end; stop; * ⑤ ; keep _NAME _TYPE _LENGTH ; run; |
結果データ「DT2」 |
解説
①
変数定義を取得するデータセットを指定。「IF 0 THEN」の部分は大分特殊な事をしてるので詳細は割愛。ざっくり言うと、変数定義を取得したいだけなので、データセットの読み込みを一部省略したような動きをしています。
②
変数定義を放り込む変数に、LENGTHを指定。
③
③
CALL VNEXTは実行する度に、順に変数定義を読みに行きます。
なので読み込む定義がなくなるまでDO UNTILでループします。
⓸
なので読み込む定義がなくなるまでDO UNTILでループします。
⓸
変数名を「_NAME」、型を「_TYPE」、変数長を「_LENGTH」という変数に放り込むよう指定。
もし変数名だけ取得したい場合、「call vnext( _NAME )」としてもOK。
⑤ 変数定義を取得した後は、STOPステートメントでデータステップを強制的に停止。
POINT
応用例
全変数一括で何か処理したい場合、「CALL VNEXT」と「CALL EXECUTE」を組み合わせると便利です。
CALL EXECUTEはデータステップ100万回の以下記事にて分かり易く解説されてるので参照下さい。
http://sas-tumesas.blogspot.jp/2013/11/call-execute.html
解説
最初のサンプルプログラムをもとに発展させたやり方です。
①
としたり、RENAMEしたくない変数がある場合、
のようにすればOK。
上2つのように書くと、以下のプログラムが生成されます。
②
もし変数名だけ取得したい場合、「call vnext( _NAME )」としてもOK。
⑤ 変数定義を取得した後は、STOPステートメントでデータステップを強制的に停止。
POINT
- 「_ERROR_」「_N_」などの自動変数の定義も読み込まれます。
- プログラム中で作成した変数(今回の例では「_NAME」「_TYPE」「_LENGTH」)の定義も読み込まれます。またこれらと同じ名前の変数がSETで読み込んだデータセットにもある場合は正しく動かなくなるので、その時はプログラム中で作成する変数名を変える必要あり。
- 型は文字変数であれば"C"、数値変数であれば"N"が入ります。
- 得られる変数名の順番は、バージョンや環境によって異なる可能性があるので当てにしない方が良い。
応用例
全変数一括で何か処理したい場合、「CALL VNEXT」と「CALL EXECUTE」を組み合わせると便利です。
CALL EXECUTEはデータステップ100万回の以下記事にて分かり易く解説されてるので参照下さい。
http://sas-tumesas.blogspot.jp/2013/11/call-execute.html
📝
プログラム中の「_NAME」と同名の変数が①の部分でSETしたデータセットにもある場合は正しく動かなくなるので、その際はプログラム中の「_NAME」を別の名前に変える必要があります。
解説
最初のサンプルプログラムをもとに発展させたやり方です。
①
RENAMEする変数を選択したい場合は、2行目の「if 0 then set DT1 (keep= drop=)」のところで、
if 0 then set DT1 ( keep=A2 A3 drop= ); |
としたり、RENAMEしたくない変数がある場合、
if 0 then set DT1 ( keep= drop=A1 ); |
上2つのように書くと、以下のプログラムが生成されます。
DATA DT3; SET DT1; RENAME A2 =XA2 A3 =XA3 ; RUN; |
②
自動変数等がRENAME対象に入らないよう除外した上で、CALL EXECUTEでRENAME処理の文を生成しています。
SASのバージョンが上がって、もし自動変数が追加されてたら、ここをちょっと変える必要あり。
SASのバージョンが上がって、もし自動変数が追加されてたら、ここをちょっと変える必要あり。
0 件のコメント:
コメントを投稿