Разобрать имя файла с помощью SAS - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть каталог, в котором каждую неделю создается новый файл.имена указаны ниже:

file_w1.csv
file_w2.csv
file_w3.csv

Что мне нужно сделать, это выбрать последний файл (на основе даты изменения), а затем проанализировать 2 символа непосредственно перед расширением файла.Так что в этом случае я хочу 'w3', потому что я хочу использовать это, чтобы знать, за какую неделю я отчитываюсь.

Как я могу сделать это в SAS?

1 Ответ

0 голосов
/ 23 ноября 2018

Независимый от операционной системы метод будет использовать функции внешнего файла SAS, такие как dopen, fopen и finfo, для получения информации о папке и ее элементах.

Рассмотрим этот пример кода, который выполняет«полный дамп» доступной информации при разборе C:\Temp на компьютере с Windows:

data _null_;
  length dfileref fileref $8 folder $200;

  rc = filename (dfileref, 'C:\Temp');

  did = dopen(dfileref);
  if did then do;
    do index = 1 to doptnum(did);
      featurename = doptname(did,index);  
      featurevalue = dinfo(did,featurename);
      put index= featurename= featurevalue=;
      if featurename = 'Directory' then folder = featurevalue;
    end; 

    do dindex = 1 to dnum(did);
      entryname = dread(did,dindex);
      put dindex= entryname=;

      rc = filename(fileref, cats(folder, '/', entryname));

      fid = fopen (fileref); * if entry is another folder fid will be 0;
      if fid then do;
        do findex = 1 to foptnum(fid);
          featurename = foptname(fid, findex);
          featurevalue = finfo(fid, featurename);
          put +2 findex= featurename= featurevalue=;
        end;
        fid = fclose(fid);
      end;

      rc = filename(fileref);
    end;

    did = dclose(did);
  end;

  rc = filename (dfileref);
run;

После изучения журнала вы можете сократить код, необходимый для сбора конкретной требуемой информации в набор данных.Затем вы можете использовать SQL-запросы для дальнейшего воздействия на данные:

data csv_files(keep=fullname lastmod where=(fullname like '%.csv'));
  length dfileref fileref $8 folder $200;

  folder = 'C:\Temp';
  rc = filename (dfileref, folder);

  did = dopen(dfileref);
  if did then do;
    do dindex = 1 to dnum(did);
      entryname = dread(did,dindex);
      rc = filename(fileref, cats(folder, '/', entryname));

      fid = fopen (fileref);
      if fid then do;
        fullname = finfo(fid,'Filename');
        lastmod = input(finfo(fid,'Last Modified'), datetime18.); format lastmod datetime18.;
        output;
        fid = fclose(fid);
      end;
      rc = filename(fileref);
    end;
    did = dclose(did);
  end;
  rc = filename (dfileref);
run;

proc sql;
  create table csv_newest as 
  select *, scan(scan(fullname,-1,'_'),1,'.') as tag
  from csv_files
  where prxmatch ('/_.+\.csv$/', fullname)
  having lastmod = max(lastmod)
  ;
...