投稿

5月, 2015の投稿を表示しています

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) ;

はじめての proc calendar - SAS

イメージ
あまり使っている人を見たことがない proc calendar を使ってみます。 まずは簡単なカレンダーを作ってみる options nocenter nodate nonumber ; /* 予定名と、開始日、終了日を作成します */ data SCHEDULE ; length NAME $256. ; NAME = "TEST-A" ; DTSTART = '01MAY2015'd ; DTEND = '01MAY2015'd ; output ; NAME = "TEST-B" ; DTSTART = '14MAY2015'd ; DTEND = '15MAY2015'd ; output ; NAME = "TEST-C" ; DTSTART = '19MAY2015'd ; DTEND = '20MAY2015'd ; output ; NAME = "TEST-D" ; DTSTART = '18MAY2015'd ; DTEND = '21MAY2015'd ; output ; NAME = "TEST-E" ; DTSTART = '23MAY2015'd ; DTEND = '31MAY2015'd ; output ; run ; /* 開始日順に並べておく必要があります */ proc sort data=SCHEDULE ; by DTSTART ; run ; proc calendar data=SCHEDULE ; start DTSTART ; /* 開始日 */ fin DTEND ; /* 終了日 */ var NAME ; /* 予定名 */ run ; 祝日一覧を追加する 予定だけでなく、祝日も追加してみましょう。 せっかくなので、祝日はテキトーな祝日ではなく、Google先生が提供している祝日一覧(.icsファイル)を使ってみます。filename url を使用して取得します

動かして覚え...なくてもいいかもしれない infileステートメント expandtabs オプション - SAS

infile ステートメントの中に expandtabs オプションというのを見つけました。名前からして、もしかしたら dlm="09"x の別名か!? これでタブ区切りのファイルを読み込むときに、タブ "09"x なんていう知らないと分からないコードを書かなくて済む! と思ったのですが、使ってみたら思ってた挙動と違っていました。 下記のようなコードでは思ってたとおりに動作します。 テストコード filename IN "/folders/myfolders/test.txt" ; data TEST ; infile IN expandtabs ; input var1 : $16. var2 : $16. ; run ; proc print ; run ; テストデータ1 ※空白はタブです。 1234567890 1234 1111 2222 A B テスト結果1 OBS var1 var2 1 1234567890 1234 2 1111 2222 3 A B expandtabsオプションは、タブを空白に置き換えるらしく、半角スペースを値として格納している場合には上手く読み込みません。 テストデータ2 ※11と11の間に半角スペースを入れました。 1234567890 1234 11 11 2222 A B テスト結果2 OBS var1 var2 1 1234567890 1234 2 11 11 3 A B タブではなく、半角スペース区切り(dlm=を指定しないときのデフォルト値)で読み込まれてしまいます。 調べてはみましたが、使いドコロが(個人的には)なさそうなオプションでした。

動かして覚える infileステートメント flowover, missover, truncover, stopover, scanover オプション - SAS

infile ステートメントで、missover オブションはよく使っているのですが、どうやら、「~over」と名付けられたオプションが他にもあるようなので、調べてみました。オンラインヘルプの文章を読んでもよく分からなかったので、試しに実行してみました。 1. flowover, missover, truncover flowoverはデフォルト値で、何も指定しなかった時と同じ動作をします。 missover と truncover は、ほぼ同じ動作をし、最後の列が欠損値のとき、欠損値として値を格納します。input ステートメントにて指定した長さよりも短いレコードが存在するとき、違いがあります。missover は、欠損値を格納しますが、truncover は入力値に応じた値を格納します。 テストコード - flowover, missover, truncover options nocenter nodate nonumber ; proc printto file="/folders/myfolders/test3.lst" new ; run ; title "デフォルト / flowover" ; data TEST ; infile "/folders/myfolders/test3.txt" flowover ; input ID 3. ; run ; proc print ; run ; title "missover" ; data TEST ; infile "/folders/myfolders/test3.txt" missover ; input ID 3. ; run ; proc print ; run ; title "truncover" ; data TEST ; infile "/folders/myfolders/test3.txt" truncover ; input ID 3. ; run ; proc print ; run ; title "missover コロン付き" ; data TEST

SASでリスト出力したテキストファイルに対して、grepコマンドを実行し「バイナリー・ファイル(標準入力)は一致しました」と出力される原因と解決方法

SASの話というよりは、Linux の grepコマンドの話。 SASでリスト出力したテキストファイル(.lst) に対して、grepコマンドを実行すると、「バイナリー・ファイル(標準入力)は一致しました」と出力されて、実行が終了されてしまう問題が発生しました。一部のリストファイルはきちんとgrepコマンドが実行されるのですが、理由が分からず右往左往してしまいました。 どうやら、grepコマンドは、バイナリファイルと思われるコードがあると、正常に動作してくれなくなるらしい(余計なことを…)。なので、明示的にテキストファイルと認識させるために、以下の3つのいずれかのオプションを付ける必要があります。 -a --text --binary-files=text これにより、テキストファイルと認識されるため、正常にgrepコマンドが実行されます。 そもそも、なぜリストファイルがバイナリファイルと認識されてしまったのか。これは、複数回リスト出力したときに発生します。 data TEST ; A = 1 ; run ; title "TEST 1" ; proc print data=TEST ; run ; title "TEST 2" ; proc print data=TEST ; run ; リストをテキスト出力したとき、人間の目には見えませんが、表と表の間に制御コード 0x0c(改ページ)が出力されています。この制御コードが、grepコマンドにリストファイルをバイナリファイルと思わせた原因でした。 参考サイト Linuxのgrep検索で「バイナリー・ファイル(標準入力)は一致しました」と表示される原因と解決方法 / r_nobuホームページ 2015/05/18 追記:ページ区切りに使われている改ページを変更する方法を発見しました! ページの区切り文字を 0x0c (改ページ) から、任意の文字に変更するオプション formdlim

SAS®認定プロフェッショナル SAS Base Programmer for SAS®9 の話

2015年2月に受験し、合格した SAS Base Programmer の話です。※ 主観が多く含まれています。また、試験範囲や、各値段は、バージョンアップや円安円高などで変わることがあるかと思いますので、ご注意ください。 筆者のSAS経験値 2015年2月時点で、SASを使い始めて10ヵ月くらいでした。 統計解析とかほとんどやらないデータマエショリストです。 どんな資格? SAS社が行なっているベンダー認定資格です。テストセンターで受験することができるので、いつでも受けることが出来ます。試験会場によっては、予約が埋まりやすいので、早めに(1ヵ月以上前?)に、予約しておくと良いです。試験に不合格になると、14日間受験できません。同じ試験に受けられる回数は、年間5回と決まっています。受験料が18000円(税抜)なので、できれば、一発で受かりたいところです。 試験範囲 2015年5月現在、SAS公式サイトでは、以下のように記載されています。 この認定の取得にはSAS®9を使用したプログラミングとデータ管理の経験が必要で、以下を行える必要があります:  ・生データファイルのインポートとエクスポート  ・データの加工と変換  ・SASデータセットの組み合わせ  ・SASプロシジャを使用した基本的な詳細レポートと要約レポートの作成  ・データエラー、構文エラー、論理エラーの識別と修正 SAS®認定プロフェッショナル SAS Base Programmer for SAS®9 マクロや、SQL、統計解析(基本統計量除く)といった分野は出ず、データの読み書き、加工、出力などの基本的なところが試験範囲です。SAS経験者で、複雑な生データ(固定長、可変長ファイル)をよく扱う方ならば、試験範囲をそれなりに網羅しているかと思います。しかし、やはり普段使わないような機能も多くあるので、勉強ゼロで受かるのはかなり難しいと思います。普段使っているプロシージャやステートメントでも、こんなオプションや使い方があったのか、ということが何度もありました。 また、個人的に問題文がなかなか癖のある文章だったので、文章にも慣れないと難しいと思いました。 勉強方法・勉強時間 SAS 認定プロフェッショナルのためのBase Programming f