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;


    0 件のコメント:

    コメントを投稿