投稿

SASの環境設定ファイル ( Configファイル ) の格納場所を知りたい - システムオプション config

イメージ
SASの環境設定ファイルは、使用するWORK領域のパス、メモリの最大サイズ、リスト・ログの出力場所、マルチバイト DBCS への対応、デフォルトのエンコーディング、実行するSASプログラムの実行前に動かすSASプログラムの指定、などなど、様々な設定をすることができます。そんな環境設定ファイルですが、けっこうディレクトリの深い場所にあって、SASのインストール場所にも依存しますし、OSによっても違います。見つけるのはなかなか面倒なファイルです。 そんな環境設定ファイルの格納場所ですが、システムオプションconfig にて設定されています。オプションの値をログに出力する proc options を用いることで簡単に見つけることが出来ます。 58 proc options option=config value; 59 run; SAS (R) PROPRIETARY SOFTWARE RELEASE 9.4 TS1M2 SAS オプション CONFIG のオプション値の情報 値 : ( /opt/sasinside/SASHome/SASFoundation/9.4/sasv9.cfg /opt/sasinside/SASHome/SASFoundation/9.4/nls/u8/sasv9.cfg /opt/sasinside/SASHome/SASFoundation/9.4/sasv9_local.cfg /opt/sasinside/SASConfig/Lev1/SASApp/sasv9.cfg /opt/sasinside/SASConfig/Lev1/SASApp/sasv9_usermods.cfg /opt/sasinside/SASConfig/Lev1/SASApp/WorkspaceServer/sasv9.cfg /opt/sasinside/SASConfig/Lev1/SASApp/WorkspaceServer/sasv9_usermods.cfg ) スコープ : SAS Session オプション値の設定方法 : Internal NOTE: PROCEDURE OPTIONS処理(合計処理時間): 処理...

SASプログラムの実行前後で、別のSASプログラム、または任意のステートメントを動かしたい - システムオプション autoexec, initstmt, termstmt

イメージ
SASプログラムの実行前や実行後に必ず実行したいプログラムとかってあるかと思います。すべてのプログラムまたは一部のプログラムにおいて、WORK領域の場所を統一したい、オプション LOG を使ってデフォルトのパスを統一したい、options msglevel=i ; は全てのプログラムで実行させたい、などなど。それを実現するためのシステムオプションのお話です。 SASプログラム実行前に実行するSASプログラムを指定する システムオプション autoexec システムオプション autoexec は、SASプログラムを指定します。指定されたSASプログラムは、SASプログラムを実行する前に、毎度実行されます。 SASプログラムの実行前に、SASプログラム /TEST/BEFORE.sas を実行するには、例えば以下のように書きます。 SASバッチモード autoexecの指定例 sas /TEST/SAMPLE.sas -autoexec /TEST/BEFORE.sas SAS環境設定ファイル autoexecの指定例 環境設定ファイルに下記の内容を追記/修正してください。 -autoexec /TEST/BEFORE.sas SAS雲丹(SAS University Edition) autoexecの指定例 SAS雲丹(SAS University Edition) では、autoexecは、以下のように設定します。画面右上のアイコンのメニューから、「Autoexecファイルの編集」を押します。 表示されたウィンドウの中に実行したいコードを入力して保存します。 これで、記載したコードが、SASプログラム実行される前に実行されるようになります。書いたコードは、フォルダの直下に autoexec.sas として保存され、直接編集することも出来ます。 SASプログラムの実行前後で、ステートメントを実行する システムオプション initstmt, termstmt ※システムオプション initstmt, termstmt は、SASの環境によっては使用できないようなので、ご注意ください。 autoexecは、SASプログラムを実行するものでしたが、これらのオプションは、任...

SASをマルチプロセスで実行したい - OSコマンドを非同期/同期で実行する systaskステートメント、実行が終るまで処理を止める waitforステートメント

今回は、(現時点では) SAS雲丹(SAS University Edition) で実行できないステートメントのお話。 SAS9.4では、DS2 でマルチスレッドができるみたいですけど、SAS9.3以前で似たようなものができないものか。proc sortとか一部のプロシージャはマルチで動くようになったけど、それだけでは足りない。SPDエンジンは使える環境ではない。どうしたものか。 そんなこんなで探して見つけたのが、systaskステートメントです。systaskステートメントは、OSのコマンドを実行するためのステートメントです。OSのコマンドを実行するには、filenameステートメントのpipe、Xステートメント、call systemルーチンなどがありますが、非同期では実行できません。systaskステートメントならば非同期または同期のどちらかを指定して実行することが出来ます。(同期 = 実行終了を待って後続の処理を実行、 非同期 = 実行終了待たずに後続の処理を実行) まず、どのように書くのかを見てみましょう。 systask command "pwd" taskname="TASK_1" status=STATUS_1 ; 上記の例では、現在のディレクトリの位置を表示する pwd コマンドを実行しています。 taskname= で指定したのがタスク名です。指定したタスクが実行終るまで待つ、指定したタスクを kill する、といったときにタスク名を使います。 status= ではコマンドの出力結果が、指定したマクロ変数に格納されます。OSやらコマンドにもよると思いますが、例えば、正常終了ならば 0 、異常終了ならば 1 が格納される、といった感じです。 また、コマンドの標準出力の結果は、ログに出力されます。 さて、systaskステートメントでどうやってマルチで動かすかというと、SASのバッチ実行を使います。SASバッチを使うことで、SASの中で、SASを非同期で実行させます。 systask command "sas sample1.sas" taskname="TASK_1" status=STATUS_1 ; systask com...

現在のオプションの内容をデータセットに格納する proc optsave 、データセットに格納されたオプションの内容を反映させる proc optload - SAS

proc optsave と proc optload のご紹介です。proc optsave は現在設定されているオプションの内容をデータセットに格納させることができます。proc optload はオプションの内容が格納されているデータセットを用いて、オプションを変更させることができます。proc optsave で一時保存しておいて、proc optload で元に戻す、みたいな感じに使えますね。 オプションの内容はデータセットに格納されるので、WORK以外にデータセットを保存しておいて、オプションの内容を各プログラムで完全統一させたいときとかも使えるかもしれません。 では、どんなふうに書けばいいのか、オプションの内容をログに表示する proc options を用いて、テストコードを書いてみます。 テストコード options nonotes ; /* 指定したオプションの内容をログに表示 */ proc options option=obs ; run ; /* 現在のオプションの内容をデータセットに格納 */ proc optsave out=OPT ; run ; options obs=100 ; proc options option=obs ; run ; /* オプションの設定内容を戻す */ proc optload data=OPT(obs=max) ; run ; proc options option=obs ; run ; 実行時の obsオプションの設定は、デフォルト値のmaxです。はじめに、proc optsave でデータセット OPT にオプションの内容を格納します。つぎにoptions obs= で値を 100 に設定します。最後に proc optload で、オプションを変更する前の設定に戻します。 実行ログ 59 options nonotes ; 60 61 /* 指定したオプションの内容をログに表示 */ 62 proc options option=obs ; 63 run ; SAS (R) PROPRIETARY SOFTWARE RELEASE 9.4 TS1M2 ...

SAS9.4から、yearcutoff オプションのデフォルト値が 1926 になっていた

SAS 9.3 までは、デフォルト値が 1920 だったのですが、SAS 9.4 では 1926 になっていました。 オプションの設定内容をログに表示する proc options で設定内容を見てみましょう。 テストコード proc options option=yearcutoff ; run ; 実行ログ 59 proc options option=yearcutoff ; 60 run ; SAS (R) PROPRIETARY SOFTWARE RELEASE 9.4 TS1M2 YEARCUTOFF=1926 2 桁の年の読み込みに日付の入出力形式で使用される、100 年周期の最初の年を指定します。 NOTE: PROCEDURE OPTIONS処理(合計処理時間): 処理時間 0.00 秒 CPU時間 0.00 秒 SAS 6 ではデフォルト値 1900 、SAS 7 からは 1920、SAS 9.4 からは 1926 みたいですね。よく変わっているみたいです。なんでこのタイミングで6年だけ変えたのか、気になるところです。 参考サイト見ると、SAS 9.4 では、sortsize とか、lrecl とか、他にもデフォルト値がけっこう変わってるみたいですね。 参考サイト Usage Note 46368: The default value for the YEARCUTOFF= system option has changed in SAS (英語) SAS(R) 9.4 Guide to Software Updates (英語)

リスト出力のページ区切り文字を 0x0c (改ページ) から、任意の文字に変更するオプション formdlim - SAS

SASでリスト出力したテキストファイルに対して、grepコマンドを実行し「バイナリー・ファイル(標準入力)は一致しました」と出力される原因と解決方法 にて、ページ区切りに 0x0c (改ページ) が使われていたせいで困ったという話を書きました。そのページ区切りですが、オプションで改ページから別の文字に設定変更できることを発見しました。 変更には、オプション formdlim を用います。 テストコード options nocenter ; /* リストの出力パスを指定 */ proc printto print="/folders/myfolders/test.lst" new ; run ; /* テストデータ */ data TEST ; A = 1 ; run ; /* ページ区切りを -(ハイフン) にする */ options formdlim='-' ; proc print ; run ; proc print ; run ; /* ページ区切りを 0x0c(改ページ) に戻す */ options formdlim='' ; proc print ; run ; proc print ; run ; 出力結果 ------------------------------------------------------------------------------------------------------------------------------------ 2015年 5月19日 火曜日 00時17分30秒 19 OBS A 1 1 ------------------------------------------------------------------------------------------------------------------------------------ ...

0 オブザベーションのデータセットに対して、data ステップを実行したい! - SAS

去年、 特定のformatに対して処理をしたい - SAS という記事を書いたのだけど、「あれ、このコード、対象のデータセットが 0オブザベーションだと処理されないんじゃ・・・・」ということに気づきました。ずっと、解決する方法を模索していたのですが、ようやく解決方法が1つ思いついたので(ちょっと無理矢理感がある方法ですが)、記事にしてみたいと思います。 下記に、0オブザベーションのデータセットを実行するための、コードを記載しています。 /* テスト用データセット */ proc sql ; create table TEST ( NUM DECIMAL format=10. ,DT DECIMAL format=date9. ,STR CHAR(10) ) ; quit ; /* 1オブザベーションのデータセット */ data KARA ; KARA=. ; run ; data TEST ; set TEST KARA(in=SW drop=KARA) ; putlog "◆◆◆◆◆ 実行されたよ! ◆◆◆◆◆" ; /* オブザベーションが追加されないように削除します */ if SW then delete ; run ; まず、proc sql の create table で 0 オブザベーションのデータセット TEST を作成します。その次に、1オブザベーションのデータセットを作成します。このデータセットの名前や変数はテキトーでいいです。 最後のdataステップが本題です。データセット TEST は 0オブザベーションですが、データセット KARA は 1オブザベーションあるので、ステップ内が1回実行されます。最後に、空のオブザベーションが、データセット TEST に追加されないように delete で削除しておきます。 今回の目的ではありませんが、この方法なら、全変数欠損値のオブザベーションも作れますね。 特定のformatに対して処理をしたい - SAS にて、記載したコードの改良版は、以下のようになります。 data TEST ; set TEST KARA(in=SW drop=KARA) ; ...