BASE SAS で不均衡な見積条件を打破するための最善の方法は何ですか?

StackOverflow https://stackoverflow.com/questions/107414

  •  01-07-2019
  •  | 
  •  

質問

基本的な SAS プログラマーであれば、以下のドリルをご存知でしょう。

バランスの取れていない引用符を含む SAS コードを送信すると、閉じられていない引用符だけでなく、閉じられていないコメント、マクロ関数定義、および欠落している実行も含まれることになります。あるいは辞める。声明。

不均衡な引用文を気にしないための最善のコツは何ですか?

役に立ちましたか?

解決

エンタープライズ ガイド 3 では、自動生成されたコードの先頭に次の行が追加されていました。

*';*";*/;run;

ただし、あらゆる種類のアンバランスな問題から実際に「リセット」する唯一の方法は、sas セッションを終了し、コードを再送信する前にアンバランスな部分のバランスを整えることです。この種の簡単な (安価な?) ハックを使用しても、根本原因は解決されません。

ところで、 ods _all_ close; 閉まる 全て ods の宛先 (デフォルトの結果の宛先を含む)。インタラクティブセッションでは、次のようにして再度開く必要があります ods results; または ods results on; 少なくともドキュメントによると。しかし、9.2 でテストしたところ、以下に示すように機能しませんでした。

%put sysvlong=&sysvlong sysscpl=&sysscpl;
/* sysvlong=9.02.01M0P020508 sysscpl=X64_VSPRO */

ods _all_ close;
proc print data=sashelp.class;
run;
/* on log
WARNING: No output destinations active.
*/

ods results on;
proc print data=sashelp.class;
run;
/* on log
WARNING: No output destinations active.
*/

他のヒント

私自身に関して言えば、普段は Googleで「SASアンバランス見積」を検索, 、そして最終的に次のようなものを送信することになります これ:

*); */; /*’*/ /*”*/; %mend;

...閉じられていないコメント、引用符、マクロ関数から抜け出すため。

こちらが私が使っているものです。

 ;*';*";*/;quit;run;
 ODS _ALL_ CLOSE;
 QUIT; RUN;

マクロ内で引用符のバランスが取れていない状況が発生し、唯一の解決策は SAS のインスタンスを閉じて最初からやり直すことでした。

それはSASの容認できない欠陥だと思います。

ただし、#2 と #5 の両方の方法を使用したところ、うまくいきました。最初に#2、次に#1。コードヘッダーを含むすべてのコードの上にそれらを配置し、このプログラムが何を行っているかを説明しました。

まるで魔法のようにうまくいきました。

私は、特定の SAS プログラムを読み取り、ペアになるべきものを追跡する Perl プログラムを書きました。括弧などを埋め込むと、各行の先頭にネストのレベルが出力されます。マクロ環境に存在するがデータ ステップ関数を呼び出す %sysfunc 呼び出しを含む、マクロ関数の一部である括弧とデータ ステップ関数の一部である括弧を区別できる必要があります (%syscall マクロについても同様のことを行う必要があります)関数呼び出し)、ただしそれは正規表現を使用して実行できます。ネストのレベルがマイナスになる場合は、問題が近くにある可能性があることを示す手がかりとなります。

また、プログラムの先頭から一重引用符と二重引用符のカウントを開始し、遭遇した各記号のカウントが奇数か偶数かを識別します。括弧と同様に、マクロ コードの一部である引用符とデータ ステップ コードの一部である引用符、および O'Riley や %nrstr(%'%") などのリテラル文字列の一部である引用符を区別できる必要があります。それらはカウントされませんが、パターンマッチングはそれも処理できます。

項目の不一致の問題がマクロ コードによって実行時に生成され、ソース プログラムに存在しないコードに起因する場合は、オプション mfile をオンにして、生成されたデータ ステップ コードをファイルに書き込み、Perl スクリプトを実行します。そのコードに対して。

私が Perl を選んだのは、強力なパターン マッチング機能があるためですが、他のパターン マッチング言語でも問題なく動作するはずです。お役に立てれば。

いつでも、送信されたステートメントを終了するコマンドを発行して、実行しようとしているものを再送信することができます。

を使用するという AFHood の提案を繰り返したかっただけです。 ODS _ALL_ CLOSE; 声明。それは含めるべき重要なものです。いずれにせよ、ODS を終了するたびに必ずこれを使用してください。

私の場合、SASセッションを閉じるとうまくいきました。ここで説明した他の方法を試す前に、これを一度試してみるとよいと思います。

はい、SAS の公式ドキュメントでは、あなたが自分で提案したソリューションが推奨されていると思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top