前のページ|次のページ

CALL SYMPUTルーチン

DATAステップで生成された値を、マクロ変数に割り当てます。

種類: DATAステップCALLルーチン
参照項目: SYMGET関数および CALL SYMPUTXルーチン

構文

CALL SYMPUT(macro-variable, value);

必須引数

macro-variable

次の項目のいずれかです。

  • SAS名を表す、引用符で囲んだ文字列。たとえば、文字列testingをマクロ変数NEWに割り当てるには、次のステートメントをサブミットします。
    call symput('new','testing');
  • SAS名の値を持つ文字変数の名前。たとえば、次のDATAステップでは、3つのマクロ変数SHORTSTP、PITCHER、およびFRSTBASEを作成し、それらに、ANN、TOM、およびBILLという値をそれぞれ割り当てています。
    data team1;
       input position : $8. player : $12.;
       call symput(position,player);
    datalines;
    shortstp Ann
    pitcher Tom
    frstbase Bill
    ;
  • マクロ変数名を生成する文字式。この形式は、一連のマクロ変数を作成する場合に役立ちます。たとえば、次のCALL SYMPUTステートメントでは、文字列POSと左に揃えられた_N_の値を結合して一連のマクロ変数名を作成します。作成したマクロ変数POS1、POS2、およびPOS3に値を割り当てています。
    data team2;
       input position : $12. player $12.;
       call symput('POS'||left(_n_), position);
       datalines;
    shortstp Ann
    pitcher Tom
    frstbase Bill
    ;

value

割り当てる値。次のいずれかを指定できます。

  • 引用符で囲んだ文字列。たとえば、次のステートメントでは、文字列testingをマクロ変数NEWに割り当てています。
    call symput('new','testing');
  • 数値変数または文字変数の名前。この変数の現在の値が、マクロ変数の値として割り当てられます。この変数が数値の場合、自動的に数値が文字列に変換されて、ログにメッセージが書き込まれます。この後のセクションで、DATAステップ変数の文字値と数値をマクロ変数に割り当てる際にSYMPUTが従うフォーマット規則について説明します。
    注: この形式は、macro-variableがSAS変数の名前、またはSAS変数を含む文字式でもある場合に最も役立ちます。データセットTeam1を作成する前述の例で示したように、各オブザベーションから固有のマクロ変数名と値を作成できます。
    macro-variableが文字列の場合、SYMPUTによって1つのマクロ変数のみが作成され、その値はプログラム内での反復ごとに変化します。プログラムの実行終了後に残る値は、最後の反復で割り当てられた値のみです。
  • DATAステップの式。現在のオブザベーションにおいて式が返す値が、macro-variableの値として割り当てられます。次の例では、HOLDATEというマクロ変数にJuly 4,1997という値が割り当てられています。
    data c;
       input holiday mmddyy.;
       call symput('holdate',trim(left(put(holiday,worddate.))));
    datalines;
    070497
    ;
    run;
    この式が数値の場合、自動的に数値が文字列に変換されて、ログにメッセージが書き込まれます。この後のセクションで、式の文字値と数値をマクロ変数に割り当てる際にSYMPUTが従うフォーマット規則について説明します。

詳細

macro-variableが、かっこで囲まれた任意のスコープ内に存在する場合、macro-variableは更新されます。macro-variableが存在しない場合、SYMPUTによってその変数が生成されます。(SYMPUTによりmacro-variableが作成されるスコープを決定する方法については次を参照してください。)SYMPUTは、プログラムの実行時にマクロ変数を割り当てます。
SYMPUTは、SCLプログラムなどのすべてのSAS言語プログラムで使用できます。SYMPUTは、マクロの実行時ではなくプログラムの実行時に変数を置換するため、DATAステップビュー、SQLビュー、およびSCLプログラムのマクロ変数値の割り当てに使用する必要があります。
SYMPUTを使用して作成された変数のスコープ
SYMPUTは、マクロ変数を、最もローカルな空でないシンボルテーブルに格納します。シンボルテーブルは、次のものを含んでいる場合、空ではありません。
  • 計算される%GOTO(計算される%GOTOは%または&を含み、ラベルに置換されます)
  • マクロの呼び出し時に作成されるマクロ変数&SYSPBUFF
ただし、ローカルシンボルテーブルが空の場合でも、SYMPUTによってそのテーブルに変数が作成される、次の3つのケースがあります。
  • SASバージョン8以降、PROC SQLの後でSYMPUTを使用すると、ローカルシンボルテーブルに変数が作成されます。
  • 実行中のマクロに計算される%GOTOステートメントが含まれる場合、SYMPUTを使用してマクロ変数を作成すると、ローカルシンボルテーブルに変数が作成されます。
  • 実行中のマクロが&SYSPBUFFとSYMPUTを使用してマクロ変数を作成すると、ローカルシンボルテーブルにマクロ変数が作成されます。
SYMPUTを使用した変数の作成の詳細については、マクロ変数のスコープを参照してください。
SYMPUTによって割り当てられる値が使用可能になる前に、それを参照しようとする場合の問題
SYMPUTを使用する場合に最もよく発生する問題の1つは、SYMPUTによって割り当てられるマクロ変数値を、その変数が作成される前に参照しようとすることです。通常、この問題は、変数の値を割り当てるCALL SYMPUTステートメントの実行が開始される前に、マクロ変数を参照しているステートメントがコンパイルされるために発生します。SYMPUTを使用する場合に覚えておくべき最も重要なことは、マクロ変数の値がプログラムの実行時に割り当てられるということです。マクロ変数参照は、ステップ、ステップの外部で使用されるグローバルステートメント、またはSCLプログラムのコンパイル時に置換されます。その結果、次のようになります。
  • プログラム内でSYMPUTを使用してマクロ変数を作成し、それに値を割り当てた場合、同じプログラム(またはステップ)内でマクロ変数参照を使用してそのマクロ変数の値を取得することはできません。
  • プログラムの後ろのグローバルステートメント(たとえば、TITLEステートメント)で値を参照する前に、ステップ境界ステートメントを指定して、強制的にDATAステップを実行する必要があります。指定できる境界は、RUNステートメント、あるいは別のDATAステートメントまたはPROCステートメントです。例えば、
    data x;
       x='December';
       call symput('var',x);
    proc print;
    title "Report for &var";
    run;
マクロ処理では、コンパイルと実行の詳細について説明されています。
文字値の割り当てのフォーマット規則
valueが文字変数の場合、SYMPUTは$w.形式を使用して値を書き込みます。ここで、wは変数の長さです。そのため、値がプログラム変数の長さよりも短い場合、末尾に空白が挿入されて書き込まれます。たとえば、次に示すDATAステップでは、変数Cの長さはデフォルトで8になります。したがって、SYMPUTは$8.形式を使用し、文字xの後ろに7つの空白を加え、それをCHAR1の値として割り当てます。これらの空白を除去するには、2番目のSYMPUTステートメントに示すように、TRIM関数を使用します。
data char1;
   input c $;
   call symput('char1',c);
   call symput('char2',trim(c));
   datalines;
x
;
run;
%put char1 = ***&char1***;
%put char2 = ***&char2***;
このプログラムを実行すると、SASログに次のメッセージが書き込まれます。
char1 = ***x *** char2 = ***x***
数値の割り当てのフォーマット規則
が数値変数の場合、SYMPUTは、BEST12.形式を使用してそれを書き込みます。その結果、右に揃えられた12バイトの文字列の値が得られます。たとえば、次に示すDATAステップでは、数値変数Xの値をマクロ変数NUM1とNUM2に割り当てています。最後のCALL SYMPUTステートメントでは、LEFT関数を使用して値を左に揃え、不要な末尾の空白を削除してから、SYMPUTルーチンによってその値をNUM3に割り当てています。
data _null_;
   x=1;
   call symput('num1',x);
   call symput('num2',left(x));
   call symput('num3',trim(left(put(x,8.)))); /*preferred technique*/
run;
%put num1 = ***&num1***;
%put num2 = ***&num2***;
%put num3 = ***&num3***;
このプログラムを実行すると、SASログに次のメッセージが書き込まれます。
num1 = *** 1*** num2 = ***1 *** num3 = ***1***

比較

  • SYMPUTは、プログラムの実行時に、DATAステップで生成された値をマクロ変数に割り当てます。一方、SYMGET関数は、プログラムの実行時に、マクロ変数の値をプログラムに返します。
  • SYMPUTは、DATAステップ内およびSCLプログラム内で使用できます。一方、SYMPUTNは、SCLプログラム内でのみ使用できます。
  • SYMPUTは文字値を割り当てます。一方、SYMPUTNは数値を割り当てます。

例: マクロ変数を作成してデータセットの値を割り当てる

data dusty;
   input dept $ name $ salary @@;
   datalines;
bedding Watlee 18000    bedding Ives 16000
bedding Parker 9000     bedding George 8000
bedding Joiner 8000     carpet Keller 20000
carpet Ray 12000        carpet Jones 9000
gifts Johnston 8000     gifts Matthew 19000
kitchen White 8000      kitchen Banks 14000
kitchen Marks 9000      kitchen Cannon 15000
tv Jones 9000           tv Smith 8000
tv Rogers 15000         tv Morse 16000
;
proc means noprint;
   class dept;
   var salary;
   output out=stats sum=s_sal;
run;
data _null_;
   set stats;
   if _n_=1 then call symput('s_tot',trim(left(s_sal)));
   else call symput('s'||dept,trim(left(s_sal)));
run;
%put _user_;
このプログラムを実行すると、次に示す変数のリストがSASログに書き込まれます。
GLOBAL SCARPET 41000 GLOBAL SKITCHEN 46000 GLOBAL STV 48000 GLOBAL SGIFTS 27000 GLOBAL SBEDDING 59000 GLOBAL S_TOT 221000
前のページ|次のページ|ページの先頭へ