ラベル 関数: FILENAME の投稿を表示しています。 すべての投稿を表示
ラベル 関数: FILENAME の投稿を表示しています。 すべての投稿を表示

2015年6月8日月曜日

ファイル参照をいっぺんに割り当てる方法



ファイル参照をいっぺんに取り消す方法の逆で、割り当てる方法。


たとえば、「C:\TEST」というパスに 「A.txt」「B.txt」「C.txt」 というファイルがあったとします。
これらにファイル参照名を割り当てたいとします。



① FILENAMEステートメント


ファイル参照名を割り当てる構文
FILENAME ファイル参照名 "割り当てるファイルのフルパス";

* ファイル参照名の割り当て ;
filename myfile1 "C:\TEST\A.txt";
filename myfile2 "C:\TEST\B.txt";
filename myfile3 "C:\TEST\C.txt";


注意:
FILENAMEステートメントに存在しないファイルを指定した場合、その存在しないファイルにファイル参照名が割り当てられます。特にエラー等のメッセージも出ません。



② FILENAME関数


データステップ内でもFILENAME関数でファイル参照名の割り当てが出来ます。


ファイル参照名を割り当てる構文
リターンコードを格納する変数 = FILENAME( "ファイル参照名", "割り当てるファイルのフルパス" );

    • 割り当てが成功したか失敗したか、などの情報はログに表示してくれません。
    • その代わり、FILENAME関数のリターンコードには以下が格納される。
      • FILENAME関数の操作が成功した場合「0」
      • FILENAME関数の操作が何かしら成功しなかった場合は「0以外」(成功しなかった場合のメッセージはSYSMSGという関数で取得できる)
      • ただし「ファイル参照をいっぺんに取り消す方法」でも触れましたが、FILENAME関数のリターンコードが意図通りにならないケースがありました。なのであまりリターンコードは信用しないほうが良いかと個人的に思ってます。
    • FILENAMEステートメントと同様で、FILENAME関数に存在しないファイルを指定した場合、その存在しないファイルにファイル参照名が割り当てられます。特にエラー等のメッセージも出ません。


    * ファイル参照名を割り当てる ;
    data _null_;
            length msg $2000.;

            rc = filename( "myfile1", "C:\TEST\A.txt" );
            if rc^=0 then do;
               msg=sysmsg();
               put msg;
            end;
            rc = filename( "myfile2", "C:\TEST\B.txt" );
            if rc^=0 then do;
               msg=sysmsg();
               put msg;
            end;
            rc = filename( "myfile3", "C:\TEST\C.txt" );
            if rc^=0 then do;
               msg=sysmsg();
               put msg;
            end;
    run;



    以下のようにDOループなどを使っていっぺんに割り当てたり、色々工夫の余地があります。

    * ファイル参照名を割り当てる ;
    data _null_;
          length x msg $2000.;
          do  x = "A", "B", "C";
               i + 1;
               rc = filename( cats( "myfile", i ) , cats( "C:\TEST\", x, ".txt" ) );
               if rc^=0 then do;
                   msg=sysmsg();
                   put msg;
               end;
          end;
    run;


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



    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ステートメントを用いる必要があります。