5

統計コースで SAS を使用する必要があるため、SAS の学習を始めたばかりです。このコースでは、大学は仮想マシンのセットアップを通じて SAS 9.2 を提供しています。大学のシステムで予約を行い、大学のサーバーの 1 つで VM を生成し、Microsoft のリモート デスクトップ クライアントを使用して VM に接続します。仮想マシンは、セッションごとに生成および消去されます。設定は毎回リセットされ、ファイルはクライアント コンピューター (VM で UNC パスによってアクセス可能) に保存する必要があります。

このセットアップ内で、ラップトップに保存されているプログラム ファイルを開くと、フル パスをハードコーディングするか、「現在のフォルダー」の設定を各セッションの開始時に行います。1 つ目は、プログラムが他の場所で実行されないことを意味するため、問題があります。特に、教授に電子メールで送信する場合はそうです。2 つ目は、この特定の UNC パスを参照するのに時間がかかり、プログラム ファイルを開くために既に同じパスを参照しなければならないため、不便です。

現在のフォルダーをプログラムを含むフォルダーにプログラムで設定することで、これを簡単にしたいと考えています。その後、ファイルを開いて作業を開始できます。プログラム file のファイル名を取得する、 fileref へのパスを取得する例、および (リンク制限を超えた) 現在のフォルダーを設定する例をいくつか見つけましたが、それらを正しい方法で組み合わせることができませんでした。私のために点をつないでください。

4

3 に答える 3

3

Windows の現在のディレクトリを SAS からプログラムで変更するには、次のXコマンドを使用できます。これは、[現在のフォルダーの変更] ダイアログ ボックスを使用するときに実際に行われることです。

x 'cd "\\computername\share name\folder"';

また、データ ステップ関数を使用してこれを行うこともできます。これはSYSTEM、リターン コードを取得するため、私が好む方法です (もちろん、より多くのタイピングを行います)。

data _null_;
   rc = system( 'cd "\\computername\share name\folder"' );
   if rc = 0 
      then putlog 'Command successful';
      else putlog 'Command failed';
run;

UNC パスが二重引用符で囲まれていることに注意してください。これは、パスに空白が含まれている場合に必要です。

もちろん、これには手動でコマンドを入力する必要がありますが、プログラムのソース コードに追加できるものかもしれません。VM 環境でサーバー上に永続的な存在を維持できる場合は、このコマンドを起動ファイルに保存できます。

教授にアドバイスをお願いします。クラスの一部として提供されたデータを使用している場合は、ソース コードのみを送信するだけでよい場合があります。一方、課題の一環として出力データを作成している場合、教授は、ソース コードと SAS データ セットを提出することを望むかもしれません。きっと彼または彼女は何らかの手続きをするでしょう。

于 2013-01-19T15:02:47.687 に答える
1

完全な答え:

SAS の鈍い表記法では、@Bob Duell の部分的な解決策 (現在のフォルダーの設定) と私の部分的な解決策 (パスの検索) を組み合わせるために、奇妙な区切り文字をいじる必要があります。関連する 2 つの重要なルールがあるようです。

  • &var は二重引用符で囲まれた文字列 ("&var") で展開されますが、単一引用符で囲まれた文字列 ('&var') では展開されません。
  • &var 内の引用符は、展開後に区切り文字として扱われません

したがって、解決策は、引用符で囲まれたパス (引用符は文字列の一部) の文字列を計算し、それを二重引用符で囲まれたパラメーター内で X または SYSTEM に展開することです。

%let qsrc=%str(%")&src%str(%");
X "cd &qsrc"

文字列を格納する必要はありません。&src と &qsrc の両方をインプレースで展開できます。これにより、単一のステートメント ソリューションが得られます。

X "cd %str(%")%substr(%sysget(SAS_EXECFILEPATH),1,%eval(%length(%sysget(SAS_EXECFILEPATH))-%length(%sysget(SAS_EXECFILENAME))))%str(%")";

これは正しく実行されますが、GUI での構文の色分けが壊れます。文字列内で、%str(%")両方""とも に展開されるため、両方の"置換は正しく実行され、GUI で正しく色付けされます。%str(%")""

X "cd ""%substr(%sysget(SAS_EXECFILEPATH),1,%eval(%length(%sysget(SAS_EXECFILEPATH))-%length(%sysget(SAS_EXECFILENAME))))""";

これは、SAS_EXECFILEPATH および SAS_EXECFILENAME が定義されている場合にのみ機能するという制限を継承します。これは、Windows GUI エディター内から実行する場合です。また、Windows コマンド ラインを呼び出すのではなく、SAS がインターセプトする「cd」コマンドの制限も適用されます。引用符を含むパスでは失敗すると思います。

于 2013-01-19T18:54:55.633 に答える
0

部分的な答え:プログラムファイルのファイル名から含まれているフォルダを取得する1つの方法

スプレッドとロギングの手順:

/* Find PathName of folder containing program */
%let FullName=%sysget(SAS_EXECFILEPATH);
%put FullName: &FullName.;
%let FullLen=%length(&FullName);
%put FullLen: &FullLen.;
%let BaseName=%sysget(SAS_EXECFILENAME);
%put BaseName: &BaseName.;
%let BaseLen=%length(&BaseName);
%put BaseLen: &BaseLen.;
%let PathLen=%eval(&FullLen.-&BaseLen.);
%put PathLen: &PathLen.;
%let PathName=%substr(&FullName,1,&PathLen);
%put PathName: &PathName.;

統合されたサイレント:

/* Find src folder */
%let src=%substr(%sysget(SAS_EXECFILEPATH),1,%eval(%length(%sysget(SAS_EXECFILEPATH))-%length(%sysget(SAS_EXECFILENAME))));

これは、SAS_EXECFILEPATHとSAS_EXECFILENAMEが定義されている場合にのみ機能し、それがいつ定義されているかは明確ではありません。WindowsGUIエディターを使用する場合は機能します。

于 2013-01-19T17:29:30.183 に答える