自動生成されたマクロ変数を利用して変数名を一括変更する

[OS] ALL
[リリース] ALL
[キーワード] DATASETS, RENAME, variable, macro

[質問]

データセットに含まれている変数の名前を変更したいと思っています。
RENAMEステートメントを利用すれば可能なことは分かっているのですが、変更したい変数が多い場合、プログラムを記述するのが大変です。
何か良い方法はありませんか。

[回答]

RENAMEステートメントの引数となる箇所を、あらかじめマクロ変数として定義しておくことで、変数名を列記する手間を省くことが可能です。
RENAMEステートメントの引数は、「既存の変数名 = 新規の変数名」 での指定となるので、この指定部分を文字列としてあらかじめマクロ変数に格納しておきます。

下記の例では、SQLプロシジャを用いて「既存の変数名 = n_既存の変数名」とした文字列を変数の数だけ生成し、各々の文字列をブランク区切りでマクロ変数へ格納した後に、DATASETSプロシジャでのRENAMEステートメントの指定に利用しています。

例:SQLプロシジャでを利用したマクロ変数の生成


                                                  /* テストデータの作成 */
  DATA a;
    col1=1;
    col3=3;
    col5=5;
    x=123;
  RUN;
                                                    /* マクロ変数の生成 */
  PROC SQL NOPRINT;
    SELECT TRIM(name)||'=n_'||TRIM(name) INTO:varlist separated by ' '
      FROM sashelp.vcolumn
      WHERE libname = "WORK" and 
            memname = "A" and 
            UPCASE(name) ? 'COL';
  QUIT;
                                                        /* 変数名の変更 */
  PROC DATASETS LIBRARY=work NOLIST;
    MODIFY a;
    RENAME &varlist;
  QUIT;
                                                          /* 変更の確認 */
  PROC CONTENTS DATA=a;
  RUN;

上記プログラム例で生成されたマクロ変数には、以下の文字列が格納されます。

生成されるマクロ変数の内容例


   col1=n_col1 col3=n_col3 col5=n_col5