Windows環境で任意のフォルダにある全ての外部ファイルをインポートする

[OS] Windows
[リリース] ALL
[キーワード] Base, DATA, PIPE, IMPORT

[質問]

任意のフォルダにある全ての外部ファイルをインポートする方法はありますか。

[回答]

FILENAMEステートメントのPIPEエンジンとマクロを使用して、インポートできます。
下記のように指定すると、システムのコマンドの出力(標準出力)に対して、ファイル参照名を割り当てることができます。


   FILENAME ファイル参照名 PIPE 'システムのコマンド';

下記の例を参考にしてください。


   /* サンプル外部ファイルの作成 */
   /* EXTFILE1.txt作成 */

   DATA _NULL_;
     FILE 'c:¥ExtFiles¥extfile1.txt';
     PUT "05JAN2001 6 W12301 1.59 9.54";
     PUT "12JAN2001 3 P01219 2.99 8.97";
   RUN;

   /* EXTFILE2.txt作成 */

   DATA _NULL_;
     FILE 'c:¥ExtFiles¥extfile2.txt';
     PUT "02FEB2001 1 P01219 2.99 2.99";
     PUT "05FEB2001 3 A00901 1.99 5.97";
     PUT "07FEB2001 2 C21135 3.00 6.00";
   RUN;

   /* EXTFILE3.txt作成 */

   DATA _NULL_;
     FILE 'c:¥ExtFiles¥extfile3.txt';
     PUT "06MAR2001 4 A00101 3.59 14.36";
     PUT "12MAR2001 2 P01219 2.99 5.98";
   RUN;

   /* DIRコマンドで、インポートするファイルが保存されている */
   /* フォルダのファイル名リストを取得 */

   FILENAME ExtFiles PIPE 'dir C:¥ExtFiles /b';

   /* 全てのファイル名を入力して、それをマクロ変数にセット */
   /* &FNAME変数にはファイル名のみ、&PEXT変数にはファイル名と拡張子をセット */

   DATA _NULL_;
     INFILE ExtFiles TRUNCOVER END=last;
     LENGTH fname $20;
     INPUT  fname;
     i+1;
     CALL SYMPUT('fname' || TRIM(LEFT(PUT(i,8.))),SCAN(TRIM(fname),1,'.'));
     CALL SYMPUT('pext'  || TRIM(LEFT(PUT(i,8.))),TRIM(fname));
     IF last THEN CALL SYMPUT('total',TRIM(LEFT(PUT(i,8.))));
   RUN;

   /* ファイル名を変更しながらIMPORTプロシジャを実行するマクロを定義 */

   %MACRO test;
     %DO i=1 %TO &total;
     PROC IMPORT DATAFILE="c:¥ExtFiles¥&&pext&i" 
                 OUT=work.&&fname&i 
                 DBMS=DLM REPLACE;
       DELIMITER=' ';
       GETNAMES=no;
       RUN;
     %END;
   %MEND;

   /* マクロの実行 */
   %test