Список файлов UNIX SAS - PullRequest
       7

Список файлов UNIX SAS

2 голосов
/ 07 февраля 2020

Я нашел код, который перечисляет все каталоги и подкаталоги по пути. но он приносит только каталог и имя файла. Не могли бы вы, ребята, помочь мне, как привести владельца и размер файла?

%macro list_files(dir);
  %local filrf rc did memcnt name i;
  %let rc=%sysfunc(filename(filrf,&dir));
  %let did=%sysfunc(dopen(&filrf));      

   %if &did eq 0 %then %do; 
    %put Directory &dir cannot be open or does not exist;
    %return;
  %end;

   %do i = 1 %to %sysfunc(dnum(&did));   

   %let name=%qsysfunc(dread(&did,&i));

   %if %index(%qscan(&name,-1,'/'),.) gt 0   %then %do;

        data _tmp;
          length dir $512 name $100;
          dir=symget("dir");
          name=symget("name");
        run;
        proc append base=want data=_tmp;
        run;quit;

      %end;
      %else %if %qscan(&name,2,.) = %then %do;        
        %list_files(&dir/&name)
      %end;

   %end;
   %let rc=%sysfunc(dclose(&did));
   %let rc=%sysfunc(filename(filrf));     

%mend list_files;

Ответы [ 2 ]

0 голосов
/ 07 февраля 2020

Используйте функцию finfo(). Вы можете сделать все это за один data шаг. Документация

/* Macro variable to store the directory. Do not keep ending slash. */
%let directory = /my/directory;

filename mydir "&directory";

data file_list;

    length directory
           filetype $15.
           filename $1000.
           owner    $100.
           size     8.
    ;

    directory = "&directory/";

    /* Open the directory */
    did = dopen("mydir");

    /* If the directory exists, loop through all files in the directory */
    if(did) then do;
        do i = 1 to dnum(did);

            /* Get the filename */
            filename = dread(did, i);

            /* Create a filename variable and create a file ID to read its attributes */
            rc  = filename('infile', cats(directory,filename));
            fid = fopen('infile');

            owner         = finfo(fid, 'Owner Name');
            size          = finfo(fid, 'File Size (bytes)');

            /* Flag if it's a directory or file */
            if(missing(size)) then filetype = 'Directory';
                else filetype = 'File';

            /* Close the file */
            rc = fclose(fid);

            output;
        end;
    end;

    /* Close the directory */
    rc = close(did);

    keep directory filename owner size filetype;
run;
0 голосов
/ 07 февраля 2020

DOPTNAME здесь ваш друг.

Прочитайте документацию SAS для "Пример 1. Использование DOPTNAME для получения информации об атрибутах каталога"

В этом примере открывается каталог с файлом MYDIR, извлекаются все системные элементы информации каталога, записывается их в журнал SAS и закрывается каталог:

%let rc=%sysfunc(filename(filrf, physical-name));
%let did=%sysfunc(dopen(&filrf));
%let infocnt=%sysfunc(doptnum(&did));
%do j=1 %to &infocnt;
   %let opt=%sysfunc(doptname(&did, &j));
   %put Directory information=&opt;
%end;
%let rc=%sysfunc(dclose(&did));

%macro test; 
 %let filrf=mydir;
 %let rc=%sysfunc(filename(filrf, physical-name));
 %let did=%sysfunc(dopen(&filrf));
 %let infocnt=%sysfunc(doptnum(&did));
  %do j=1 %to &infocnt;
   %let opt=%sysfunc(doptname(&did, &j));
   %put Directory information=&opt;
  %end;
 %let rc=%sysfunc(dclose(&did));
%mend test;

%test
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...