2019年11月20日水曜日

外部ファイルの属性情報(更新日時やファイルサイズなど)を取得する方法 (FOPEN関数編)




※今回使用する「FOPEN関数」を使用すると「SASが裏で対象のファイルを開く」点にご注意ください。
開いてる間はSAS以外から編集が出来ないなども起こるかもしれません。




では以下 SAS Ondemand for Academics 上に配置したファイルの属性情報を取得してみます。









filename test 'ファイルのパス/mysas/sakura1.jpg';

data out1;
     /* ファイルを開く */
     fid = fopen( 'test' );

     /* ファイル属性を取得 */
     length name $50. info $1000.;

     do  i = 1 to foptnum( fid );
          name = foptname( fid, i );
          info = finfo( fid, name );
          output;
     end;

     /* ファイルを閉じる */
     rc = fclose( fid );

     keep name info i;
run;


※ 取得される属性情報は、環境や言語設定などによって異なります。
色々な環境で実行する可能性がある場合は、ご注意ください。







解説


FOPEN関数でファイルを開きます。

 FOPEN( "開きたいファイルが割り当てられたファイル参照名" )

戻り値として、開いたファイルの識別番号が返されるので、その番号を変数FIDに入れてます。
この識別番号は、以降の処理で使います。



FOPTNUM関数でファイルの属性数を取得できます。

 FOPTNUM( ファイルの識別番号 )

ここで、得られた属性数だけDOループをまわして、以下の関数で全ての属性値を取得しています。



FOPTNAME関数でファイル属性名を取得できます。("作成日"や"更新日"といった属性名の部分)

 FOPTNAME( ファイルの識別番号 , 属性番号 )



FINFO関数でファイル属性値を取得できます。

 FINFO( ファイルの識別番号 , ファイル属性名 )



FCLOSE関数でファイルを閉じます。

 FCLOSE( ファイルの識別番号 )


2019年11月10日日曜日

ライブラリ内の全データセットから、指定したデータセットだけ残して全て削除する





PROC DATASETS の「SAVEステートメント」でタイトルにある通りのことが出来ます。
あまり知られていない機能なので、覚えておくと便利です。



以下では、WORKのDT1~DT5のうち、DT1だけ残して全部削除しています。

data DT1 DT2 DT3 DT4 DT5;
run;


proc datasets lib=WORK nolist memtype=data;
    save DT1;
quit;



データセットだけでなくビューも含めたい場合は「MEMTYPE=」に「VIEW」を追記すればOK

proc datasets lib=WORK nolist memtype=(data view);
    save DT1;
quit;



2019年11月7日木曜日

SASデータセットを削除するDATASETSプロシジャ






データセットを削除する方法1

PROC  DATASETS  LIB=ライブラリ名   MEMTYPE=DATA  NOLIST;
     DELETE  データセット名1  データセット名2 ・・・ ;
QUIT;

  • 「DELETEステートメント」に削除したいデータセットを列挙します。



proc datasets lib=work memtype=data nolist;
  delete dt1 dt2 dt3;
quit;






データセットを削除する方法2  (注意事項あり)

PROC  DATASETS  LIB=ライブラリ名  MEMTYPE=DATA  KILL  NOLIST;
QUIT;


  • 「KILLオプション」でライブラリ内の「全てのデータセット」を削除します。
  • 「全てのデータセット」なので、たとえば「DELETEステートメント」で削除するデータセットを指定していても意味はなく、ライブラリ内の全データセットを削除します。





ちなみに

データセットだけでなくビューも含めて削除したい場合は「MEMTYPE=」に追記すればOK

proc datasets lib=work memtype=(data view) kill nolist;
quit;




2019年11月1日金曜日

カタログからフォーマットを削除する方法






フォーマットを削除する方法1

PROC CATALOG  CAT=ライブラリ名.カタログ名;
     DELETE  フォーマット名1  フォーマット名2 ・・・ / ET=フォーマットの種類;
RUN;


  • 「DELETEステートメント」に削除したいフォーマットを列挙します。
  • 「ET=オプション」に削除する「フォーマットの種類」を指定します。
  • 「フォーマットの種類」には以下があります。
    • FORMAT   ...  数値フォーマット
    • FORMATC ...  文字フォーマット
    • INFMT       ...  数値インフォーマット
    • INFMTC    ...  文字インフォーマット



/* Sample */
proc format;
   value     a      1      = "aaa" ;
   value     $b   "aaa" = "bbb" ;
   invalue   c     "aaa" = 1 ;
   invalue   $d   "aaa" = "bbb" ;
run;

/* フォーマットの種類ごとに削除 */
proc catalog cat=work.formats;
    delete a / et=format;
    delete b / et=formatc;
    delete c / et=infmt;
    delete d / et=infmtc;
quit;



ちなみに、以下のように書くことも可能です。

proc catalog cat=work.formats;
    delete a (et=format)  b (et=formatc) c (et=infmt) d (et=infmtc);
quit;






フォーマットを削除する方法2  (注意事項あり)

PROC CATALOG  CAT=ライブラリ名.カタログ名  KILL FORCE;
RUN;


  • カタログ内の「全エントリー」を削除します。
  • 「全エントリー」とはフォーマットだけでなくマクロなどのあらゆるエントリーを含みます。
  • 「KILL」オプションは PROC CATALOG 内の他のオプションやステートメントより先に動作します。たとえばDELETEステートメントで削除するフォーマットを指定していても意味はなく、カタログ内の全エントリーを削除してしまいます。



2019年10月26日土曜日

データステップでOSのコマンドを実行する「CALL SYSTEM」




データステップでOSのコマンドを実行する「CALL SYSTEM」をご紹介します。
これあんまり知られてない気がする。



例1 (Windows環境)
options noxwait;

data _null_;
    call system( "start excel" );
run;

  • 上の例では「call system( "start excel" )」でExcelを起動するOSのコマンドを生成してます。
  • OSのコマンド実行時にコマンドプロンプトが開かれてSASの処理が一時停止状態になります。システムオプション「noxwait」を設定すると、コマンド実行後にコマンドプロンプトを自動で閉じてSASの処理を継続させます。

なんといっても、データステップでOSのコマンドが生成できちゃうのが魅力ですね。


2019年10月16日水曜日

マクロの実行を中止する「%RETURNステートメント」




  • %RETURNステートメント」でマクロの実行を中止します。
  • 「%RETURN」が書かれたとこから中止される。
  • 「親マクロ」の中に「子マクロ」を入れたネスト構造のマクロで、「子マクロ」の中のみに%RETURNを指定した場合は「子マクロ」のみ中止される。




私はよく以下のような感じで使ってます。



%macro test( in_ds=, out_ds= );
 
    * 引数チェック ;
    %if %sysfunc( exist( &in_ds ) ) = 0 %then %do;
         %put WARNING: データセット &in_ds が存在しません. マクロTESTを中止します;
         %return;
    %end;

    * 引数チェックをクリアしたあとの処理 ;  
    data &out_ds;
        set &in_ds;
    run;

%mend;
%test( in_ds=work.aaa, out_ds=bbb )


ログ




最初にマクロの引数がちゃんと正しく設定されてるか確認して、正しくない場合、

  • WARNINGとかのメッセージを出して、
  • %RETURNでマクロを中止させる。

みたいな流れです。


2019年10月14日月曜日

「SASデータセット」や「外部ファイル」の存在確認




  • EXIST関数・・・「SASデータセット」の存在確認をする。
  • FILEEXIST関数・・・「外部ファイル」の存在確認をする。
  • 存在する場合「1」、存在しない場合「0」が返される。




data test;
    x = exist( "sashelp.class" );
    y = fileexist( "c:\test/test.xlsx" );
run;



記事の内容うっすい・・