2019年2月14日木曜日

定義済みのオプションがないCASライブラリ

SAS Management ConsoleからCASライブラリを定義したが、詳細設定の中に定義済みライブラリのオプションが無かった。これがないと、EGを起動したときに、ライブラリを右クリックして割り当てしないと、データを参照できない。回避策としては、コードタスクで割り当てを仕込んでおけば回避できる。

なんでPre-Assignの定義がないのか不思議だが、いったん放置します。


2019年2月12日火曜日

OSとSASのエンコーディングが違う設定で日本語のディレクトリを作るとどうなるか?

クイズです。
Linux環境において、OSのエンコーディングがUTF-8、SASはSJISの場合、以下のコードを実行すると、作られるディレクトリ名はどのようになるでしょうか?

options dlcreatedir;
libname newdir '/var/tmp/漢字ディレクトリ';


  1. OS上のディレクトリ名は、SASと同じSJISになる。 .
  2. OS上のディレクトリ名は、OSのロケールと同じUTF8になる。 .
  3. OS上のディレクトリ名は、文字化けして正しく表示できない。 .
  4. エンコーディングの不一致でエラーが発生する。


正解は、3.でOSと同じロケールでディレクトリが作成されます。これは、SASはOSのロケールと異なる場合には、変換してOSに合わせてディレクトリを作成する動きをします。これは実験の結果でわかったことです。

2018年11月9日金曜日

Windows PCにPython/SWATを導入して、Titanicのサンプルを実行する

仕事でSAS Viya3.4とPython/SWATの導入を行うことになりました。Viyaのインストールは人任せですが、Python/SWATは勉強がてら自分のノートPCに入れてみました。Anaconda、Python/SWATとDLPyをインストール、サンプルのTitanicを動かすところまで試します。

まずは、Anacondaを検索してインストーラをダウンロードします。


インストーラに従って、Anacondaを入れます。途中でmicrosoft VSCodeを入れるか質問されましたが、スキップします。PATHを書き換えるかどうか質問されますが、これは書き換えません。複数バージョン使うために、PATHには入れないという解説がどこかにありまました。

15-20分ほど掛かってインストールできたら、WindowsのスタートメニューからAnacondaが入っていることを確認します。


次に、Python/SWATとDLpyをインストールします。スタートメニューにある、Anacond Promptを起動し、pipコマンドでインストールします。 具体的なコマンドは画面イメージを参照してください。
DLPyも同じようにpipコマンドで、インストールします。 もしwisted 18.7.0 requires PyHamcrest>=1.9.0, which is not installed. というようなメッセージでたら、pip install -U PyHamcrest でアップグレードしてください。

次に、サンプルのコードをGibHubから引っ張ってきます。URLは画面イメージを参照してください。右側の緑のボタンでダウンロードして、Desktopに展開します。


Windowsのスタートメニューから Jupyter Notebookを選択します。

Jupyter NotebookのFileタブから、 Desktopに展開したsas-viya-programming-master\python\titanic\TitanicExample.ipynb を開きます。

 Viyaのサーバーに接続する箇所を修正します。具体的な箇所は画面イメージを参照してください。
最初のセル(import numpyの部分)を選択して、再生ボタンをポチポチおすと処理が進んでいきます。

2018年10月24日水曜日

メタデータに登録されているDefaultAuthのログインを変更する。

SAS9のメタデータを操作するときの資料の在りかをメモしておきます。

ユーザのADドメインが変更されるときに、DefaultAuthのログインを書き換える必要があります。10人ぐらいだと手でもできますが、数百人を手作業だと時間もかかかるのと、確実性に欠けます。で、SASプログラム書いてメタデータ書き換えるのに参考となる資料が、SAS® 9.4 LanguageInterfaces to Metadata,Third Edition です。

この中にあるサンプル、PROC PRINT of Logins Data Setが役立ちます。メタデータからログインの情報を検索して、データセット化してくれます。この中に書き換えるログインの名前、オブジェクトIDを特定できます。オブジェクトのIDが判れば、metadata_setattrでURI、項目、値を指定してあげれば書き換えできます。

オブジェクトの項目は様々で探すのが面倒です。そんなときには以下の記事が役立ちます。昔ながらのDMS又はSMCのツールから、メタデータオブジェクトの情報を検索できます。

2018年8月28日火曜日

データステップにデータセット名ではなく、パスを直接書く

データステップの書き方で、データセット名ではなくファイルのパスを直接書けます。これは、同僚に教えてもらいました。マニュアルを見ると、以下のようにTIPSとして記述がありました。 Tips:Instead of using a data set name, you can specify the physical pathname to the file, using syntax that your operating system understands. The pathname must be enclosed in single or double quotation marks.

1          data "/var/tmp/mylib/class";
2               set sashelp.class;
3               keep age name;
4          run;

NOTE: There were 19 observations read from the data set SASHELP.CLASS.
NOTE: The data set /var/tmp/mylib/class has 19 observations and 2 variables.
NOTE: DATA statement used (Total process time):
      real time           0.01 seconds
      cpu time            0.01 seconds


NOTE: SAS Institute Inc., SAS Campus Drive, Cary, NC USA 27513-2414
NOTE: The SAS System used:
      real time           0.08 seconds
      cpu time            0.03 seconds

% ls -l /var/tmp/mylib
-rw-rw-r-- 1 sas sas 131072  8月 28 17:39 2018 class.sas7bdat

2018年5月9日水曜日

カタログにSASプログラムを格納するサンプル

カタログにプログラムを格納するサンプルです。探したら良い例が見つからなかったのでメモしておきます。

/* ディレクトリにあるMM_MISC.sasをカタログに格納する */
filename there '/tmp' ;
libname mylib '/tmp/sashelp' ;

%let trialcode = MM_MISC;
%let catname = modelmgr;

data _null_ ;
    filename mycat catalog "mylib.&catname" lrecl= 256 ;
    file   mycat("&trialcode..source") ;
    infile   there("&trialcode..sas") ;
    input ;
    put _infile_ ;
run;

proc catalog c=mylib.&catname;
    contents;
run;
quit;

/* 格納したプログラムを読み込む */
filename chkinit catalog "mylib.&catname..&trialcode..source";
%include chkinit;


2018年5月2日水曜日

カタログに含まれているソースコードを1ずつ取り出してファイルに保存

カタログの中に含まれているソースコードを、1つずつ取り出してディレクトリに出力するマクロです。Model ManagerのAPIの中身を見るために、書きました。

/* ソースコードをファイルに出力するマクロ */
%macro _myfile(catalog=, memname=, dir=);
 data _null_;
  infile "&catalog..&memname..source" catalog;
  file "&dir./&memname..sas";
  input;
  put _infile_;
 run;
%mend;

/* カタログに含まれているソースコードをディレクトリに出力するマクロ */
%macro extract_source(in=, dir=);
 %local out memname;

 data;
  stop;
 run;

 %let out=&SYSLAST;
 %let memname=%substr(&out, 6); 

 proc catalog catalog=∈
    contents out=&out;
 run;

 data _null_;
  set &out(keep=name type);
  where type eq 'SOURCE';
  attrib catalog length=$32;
  attrib dir length=$128;
  catalog = "&in";
  dir = "&dir";
  call execute('%_myfile(catalog='||catalog||", memname="||name||", dir="||dir||")");
 run;

 proc datasets lib=work nolist;
  delete &memname;
 quit;
%mend;

%extract_source(in=sashelp.modelmgr, dir=/var/tmp);