4

rootというマクロ変数を定義してSASコードを整理しようとしています。%INCLUDE次に、すべてのステートメントで値を使用できるようにしたいので、ルートの観点からを&root定義できます。%INCLUDE

%LET root = C:\Documents and Settings\me\Desktop\mine\SAS;
%include "&root\lib\work.sas"

ただし、SAS 9.2でこれを実行しようとすると、ログから次のエラーが発生します。

1    %LET root = C:\Documents and Settings\me\Desktop\mine\SAS;
ERROR: Incorrect %INCLUDE statement will not be executed. There is a syntax error.
2    %include "&root\lib\work.sas"

したがって、&root変数が%INCLUDEステートメント内の値に展開されていないように見えます。私は何が間違っているのですか?

ありがとう!

[編集]回答

ステートメント';'の最後にがありませんでした。%INCLUDE= /

4

3 に答える 3

4

そのような状況では、おそらくマクロ変数名の終わりを示すセパレーターを使用する必要があります。これは「。」であるため、コードは次のようになります。

%LET root = C:\Documents and Settings\me\Desktop\mine\SAS;
%include "&root.\lib\work.sas"

これは、変数名が何かに「触れる」場合にのみ実際に必要ですが、常に使用することをお勧めします。これは良い習慣です。また、変数名の後にドットがある場合は、「その」ドットを配置する必要があるため、次のように2つのドットがあります。

%LET root = C:\Documents and Settings\me\Desktop\mine\SAS;
%LET fname = work;
%include "&root.\lib\&fname..sas"

編集

@Joeが他の回答で正しく述べているように、その状況での本当の問題は、%INCLUDEステートメントの後にセミコロンがないことです。パスの後に配置すると、問題が解決するはずです。

于 2012-09-18T17:44:34.747 に答える
3

私はあなたのエラーの提示とあなたの受け入れられた答えに少し混乱していると言わなければなりません。私の経験では、ERROR: Incorrect %INCLUDE statementは2行目の前ではなく、後に表示されます。さらに、マクロ変数の解決が問題である場合は、次のように表示されます。

903  %LET root = C:\temp;
904
905  %include "&roots\test.sas";
WARNING: Apparent symbolic reference ROOTS not resolved.
WARNING: Physical file does not exist, C:\Users\xxxx\&roots\test.sas.
ERROR: Cannot open %INCLUDE file &roots\test.sas.

インクルードされたコードでは、%includeの後にセミコロンはありません。それはおそらく問題に関連していますか?%includeを実行してから、たとえば逆の順序で実行するなど、不正な別の行を実行すると、そのエラーが発生します(ただし、%includeの後でも)。

于 2012-09-19T18:02:45.977 に答える
2

コード内のこのステートメントの前に、別のバグがあると思われます。SASを再起動して、これら2行のコードだけを実行してみてください。正常に機能するはずですが、私にとっては問題なく機能しました

%let root = c:\documents and settings\robert.penridge\desktop\mine\sas;
%include "&root\lib\work.sas";

編集:私は実際にセミコロンを追加したので、これは私のために働きました。@Joeが問題を正しく診断した後、これを実現しました。

デスクトップに次のフォルダ構造を作成しました。

\mine\sas\lib

次に、work.sasを次の内容でそこに配置します。

%put blah;

コードを実行すると、結果blahはエラーメッセージなしで問題なく出力されました。実際、私はこのようなコードをSASの多くのバージョンと多くのオペレーティングシステムで長年使用してきました。コードに問題はありません。

他のいくつかの回答がここで示唆していることとは対照的に、SASは、\文字をマクロ名の一部にすることはできないことを知っているので、マクロの終わりを.文字で明示的に示す必要はありません。

最後に、マクロコードをデバッグしようとしている場合は、次のオプションをオンにすることもできます。

option mprint mlogic macrogen symbolgen source source2;

次のようにオフに戻すことができます。

option nomprint nomlogic nomacrogen nosymbolgen nosource nosource2;

これらの一部は、SAS環境でデフォルトですでにオンになっている可能性があることに注意してください。

まれに、マクロ引用の問題が発生する場合もあります。これは、などのマクロ関数を使用している場合に発生します。この場合、問題の原因となっているマクロ変数の周囲の関数%str() %bquote()を使用することで解決できることがよくあります。%unquote()コードサンプルからは、これが問題であるようには見えませんが、投稿用にコードを簡略化した可能性があります。この場合、状況に応じてコードは次のように変更されます。

%let root = c:\documents and settings\robert.penridge\desktop\mine\sas;
%include "%unquote(&root)\lib\work.sas";
于 2012-09-19T17:02:15.270 に答える