CALL SYMPUT対CALL SYMPUTXまたはダミーのSAS Base

こんにちは、読者の皆様。
この記事では、SAS Base言語の2つの手順とそれらのアプリケーションのわずかな微妙さについてお話します。
すでにこの言語で十分に作業している人にとっては、これらのことは初歩的なように思えますが、初心者にとってはおそらく、SAS Baseの知り合いの最初に踏み込んだ熊手を避けるのに役立つでしょう。

コールシンプト


呼び出しSymputは、データステップ(データステップ)の変数の値をマクロ変数に割り当てる必要がある場合に使用されます。
構文: call symput ("<>", < >)

symputプロシージャの最初の引数は、2番目の引数の値を割り当てる必要があるマクロ変数の名前です。

2番目の引数は、マクロ変数に割り当てられる文字値です。 2番目の引数は常に正確にシンボリックである必要があります。そうでない場合は、マクロ変数に割り当てる前に数値をシンボル変数に変換する必要があります。 入力しないと、問題が発生する可能性があります。 この場合、SASは変数の数値をマクロ変数に割り当てる前に自動的に記号値に変換し、変換が実行されたことをログメッセージに表示します。

例:
data _null_;
count=1978;
call symput('count',count);
run;
%put &count;

19 data _null_;
20 count=1978;
21 call symput('count',count);
22 run;

NOTE: Numeric values have been converted to character values at the places given by: (Line):(Column).
21:21
NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.01 seconds

23 %put &count;
1978


マクロ変数countは1978として定義されていましたが、SASは次のように述べました。
NOTE: Numeric values have been converted to character values at the places given by: (Line):(Column).
21:21


これを回避するには、数値をマクロ変数に割り当てる前に、数値を文字値に変換する必要があります。 ここでは、たとえば、これを行う方法:

data _null_;
count=1978;
call symput('count',strip(put(count,8.)));
run;
%put &count;

29 data _null_;
30 count=1978;
31 call symput('count',left(put(count,8.)));
32 run;

NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds

33 %put &count;
1978


注:
  1. CALL SYMPUTを使用して変数を作成したという事実にもかかわらず、このマクロ変数を同じデータステップで直接使用することはできません。 この現象の理由は、データステップがコンパイルおよび実行される前にマクロコードがコンパイルおよび実行されるためです。 そのため、 CALL SYMPUT作成されたマクロ変数は、データステップコードの実行後または実行中にのみ作成および割り当てられるため、データステップでは使用できません。
    (データステップ内で同じマクロ変数にアクセスする必要がある場合は、もちろん2つの異なるマクロ関数RESOLVEまたはSYMGETを使用してこれを行うことができます)
  2. SASは数値を常に右揃えにします。これにより、数値変数の値がその長さより短い場合、変換中にシンボル変数の先頭にスペースが挿入されます。 これらのスペースを取り除くには、先頭のスペースをすべて削除する関数を使用します(上記の例のように)。
  3. CALL SYMPUTプロシージャがマクロの外部(つまり、オープンソース)で使用される場合、グローバルマクロ変数を作成しますが、マクロの内部で使用される場合、ローカル変数を作成します。


コールシンプトックス


CALL SYMPUTトラップをバイパスするために、SASはバージョン9でCALL SYMPUTXを発表しました。
CALL SYMPUTXに対するCALL SYMPUTは次のとおりです。
  1. SYMPUTX数値をマクロ変数に割り当てる前に、数値を文字変数に自動的に変換します。 (上記の例のようにPUT式を使用して手動で変換する必要はなくなりました)
  2. CALL SYMPUTXは、先頭および末尾のスペースを削除します。 したがって、余分なスペースをクリアするためにSTRIPLEFTなどの関数は必要ありません。

構文: call symputx ("<>", < >, < >)

最初の2つの引数は、 CALL SYMPUT引数に似ています。 3番目の引数(シンボルテーブル)はオプションで、値G、L、またはFを取ることができます。Gを指定すると、グローバルシンボルテーブルにマクロ変数が作成されます。Lを指定すると、SASはマクロ変数をローカルテーブルに保存します。 3番目の引数が指定されていないかFに設定されている場合、 CALL SYMPUTXCALL SYMPUTXと同様に動作します。

例:
data _null_;
count=1978;
call symputx('count',count,'G');
run;
%put &count;

29 data _null_;
30 count=1978;
31 call symputx('count',count,'G');
32 run;

NOTE: DATA statement used (Total process time):
real time 0.00 seconds
cpu time 0.00 seconds

33 %put &count;
1978

注: CALL SYMPUT代わりにCALL SYMPUTXを使用した場合、プログラムは同じように実行されますが、数値の文字値への自動変換に関するログがログに発行されます。

CALL SYMPUTCALL SYMPUTX違い覚える簡単な方法
(SAScommunity.orgのUsing_the_SAS_V9_CALL_SYMPUTX_Routineから取得)

SAS V9 CALL SYMPUTXプロシージャを使用すると、キーストロークを保存し、よりコンパクトでわかりやすいコードを作成できます。
使用する代わりに
call symput('macrovar', trim(left(charvar)));
余分なスペースを含む可能性のある文字列でマクロ変数を作成するには、SYMPUTXを使用する必要があります。
call symputx('macrovar', charvar);

Source: https://habr.com/ru/post/J142147/


All Articles