2016-10-06 2 views
0

このマクロ文字列比較は、私にとって謎の方法で動作します。明らかなのは、%test1(intotest)%test2(intotest)の結果が等しいことです。sasマクロの文字列比較は、同じ方法で同じではありません

%macro test1(intotest=); 
    %str(&intotest) = %str("b"); 
%mend; 

%macro test2(intotest); 
    %if %str(&intotest) = %str("b") %then 
     1; 
    %else 0; 
%mend EAF; 

data datatable; 
    fromtable = 'b'; 
    test1 = %test1(intotest=fromtable); 
    test2 = %test2(intotest=fromtable); 
run; 

出力は fromtable=b,test1=1,test2=0

それは%test1()と同じ結果を与え、まだ入力としてDataTableの情報を使用するように、どのように私は%test2()を書き換えるでしょうか?ありますか

+1

これはマクロコードの恐ろしい使用です。これを使わないでください。これが学問的な運動でない限り、あなたは本当に何をしようとしていますか? Proc fcmpは関数用です。 – Reeza

+1

'%mend EAF'はどういう意味ですか?引数なしで '%mend'を使用したり、終了したいマクロの名前だけを使用しました。 –

+0

@ StigEide "警告:マクロ定義TEST1の場合、%MEND文の余分なテキストが無視されました。" –

答えて

2

SAS言語がデータセット(および他のソース)でデータを処理するように設計されています。マクロ言語は、テキストを処理してSAS言語コードを生成するように設計されています。

最初の例では、正常SASコードfromtable = "b";を生成し、データセット変数fromtableのデータ値は、リテラル値bに等しい(レコードごとに)SASコードを評価することがマクロ言語を使用しています。さて、%str()関数は必要ありません。

第2の例では、マクロ言語を使用してデータステップ変数に格納されたデータを処理しようとしています(希望する)。マクロ言語はデータステップデータを処理しません。 [いくつかの例外がありますが、彼らがあなたの理解に役立つとは思っていません。]マクロ言語では、テキスト文字列fromtableとテキスト文字列を比較しています(文字列は3文字です。マークは値の一部です)。マクロ言語では、fromtableという名前のデータステップ変数があることはわかりません。データステップ、データセット、データセット変数などがあることはわかりません。テキスト文字列fromtableはマクロ戻り文字列"b"、に等しくないので0

1

コードはマクロを実行した後、このデータステップに等しい。

data datatable; 
    fromtable = 'b'; 
    test1 = fromtable = "b";; 
    test2 = 0; 
run; 
1

最初のマクロは、(望ましくない余分なセミコロンを含む)SASコードを生成している2つ目は、1つだけの単語を生成していること0または1のいずれかです。 MPRINTオプションをオンにすると、その違いがSASログに明白に表示されます。

67   data datatable; 
68    fromtable = 'b'; 
69    test1 = %test1(intotest=fromtable); 
MPRINT(TEST1): fromtable = "b"; 
70    test2 = %test2(intotest=fromtable); 
MPRINT(TEST2): 0 
71   run; 
関連する問題