2015年6月8日月曜日

ファイル参照をいっぺんに取り消す方法



1つまたはすべてのファイル参照を取り消す方法を紹介します。



① FILENAMEステートメント


ファイル参照を取り消す構文
FILENAME ファイル参照名 CLEAR;

    すべてのファイル参照を取り消す構文
    FILENAME _ALL_ CLEAR;


      * 適当にファイル参照を割り当て ;
      filename test1 "適当なファイルパス1";
      filename test2 "適当なファイルパス2";

      * ファイル参照「TEST2」のみ取り消す ;
      filename test2 clear;




      ② FILENAME関数


      データステップ内でもFILENAME関数でファイル参照の取り消しが出来ます。


      ファイル参照を取り消す構文
      リターンコードを格納する変数 = FILENAME( "ファイル参照名" );

        • 取り消しが成功したか失敗したか、などの情報はログに表示してくれません。
        • その代わり、FILENAME関数のリターンコードには以下が格納される。
          • 取り消せた場合「0」
          • なんらかのERROR、WARNINGなど特記事項がある場合は「0以外」(特記事項はSYSMSGという関数で取得できる)
          • ただし、うまくいかないケースを見つけました(記事の最後に解説してます)


        * 適当にファイル参照を割り当て ;
        filename test1 "適当なファイルパス1";
        filename test2 "適当なファイルパス2";

        * ファイル参照「TEST1」「TEST2」を取り消す ;
        data _null_;
                length msg $2000.;

                rc = filename( "test1" );
                if rc^=0 then do;
                   msg=sysmsg();
                   put msg;
                end;

                rc = filename( "test2" );
                if rc^=0 then do;
                   msg=sysmsg();
                   put msg;
                end;
        run;



        以下のようにDOループなどを使ってドカッと取り消したり、色々工夫の余地があります。

        * 適当にファイル参照を割り当て ;
        filename test1 "適当なファイルパス1";
        filename test2 "適当なファイルパス2";
        filename test3 "適当なファイルパス3";

        * ファイル参照「TEST1」~「TEST3」を取り消し ;
        data _null_;
              length msg $2000.;
              do i = 1 to 3;
                   rc = filename( cats( "test", i ) );
                   if rc^=0 then do;
                       msg=sysmsg();
                       put msg;
                   end;
              end;
        run;

        上の例を簡単に説明しておくと、
        • DOループで変数 i の値を1~3まで変化させながら、
        • CATS関数で "test" という文字と変数 i の値を結合します。
        • その結合した文字が表すファイル参照名をFILENAME関数で取り消しています。


        注意点

        「存在しないファイル参照名」を取り消そうとした場合、
        FILENAMEステートメントの場合は、WARNINGが出力されますが、

        filename abcd clear;

        ログ(ファイル参照名が存在しない場合):
        WARNING: ABCDが割り当てられていません。


        FILENAME関数で「存在しないファイル参照名」を取り消そうとすると、なぜかリターンコードに0が返されました(失敗扱いにならない)
        そのため、SYSMSG関数でWARNINGやERROR等のメッセージを取得することが出来ませんでした。


        ログにメッセージが出てくれないと困る、という場合はFILENAME関数ではなく、FILENAMEステートメントを用いる必要があります。


        0 件のコメント:

        コメントを投稿