Удаление 3-летних файлов с помощью sas

Я пытаюсь удалить файлы, которые имеют 3-летние файлы из папки. Но когда я запускаю код, он также удаляет другие файлы, которые не находятся в имени файла frmat, который я пытался удалить. Имя файла похоже на SFRE_BIL_SIT_20160812_134317_PAM_FILES1.zip я прикрепил код также с этим

options mlogic;
%macro delete_year_files_in_folder(folder);
   filename filelist "&folder";
   data _null_;
      dir_id = dopen('filelist');
      total_members = dnum(dir_id);
      do i = 1 to total_members; 
       member_name = dread(dir_id,i);
    datestring = scan(member_name,4,'_');       
    month = input(substr(datestring,5,2),best.);
    day = input(substr(datestring,5,2),best.);
    year = input(substr(datestring,1,4),best.);
    date = mdy(month, day, year);
         if intnx('year', today(),-3,'S') > date   %put _all_;
         then do;
          file_id = mopen(dir_id,member_name,'i',0);
          if file_id > 0 then do; 
            freadrc = fread(file_id);
            rc = fclose(file_id);
            rc = filename('delete',member_name,,,'filelist');
            rc = fdelete('delete');
         end; %put _all_;
         rc = fclose(file_id);
      end;
      end;
      rc = dclose(dir_id);
   run;
%mend;
Метки

1 ответ

  1. Я вижу по крайней мере одну ошибку в вашем коде, которая может вызвать неожиданное поведение:

    month = input(substr(datestring,5,2),best.);
    day = input(substr(datestring,5,2),best.);
    

    Я думаю, что вы хотели напечатать:

    day = input(substr(datestring,7,2),best.);
    

    Я бы не сделал этого, хотя-это быстрее, чтобы использовать дату информаты, чтобы сделать это:

    date = input(datestring,yymmdd8.);
    

    Однако, я думаю, что большая проблема с этой линией:

    if intnx('year', today(),-3,'S') > date then do; /*Deletion logic follows*/
    

    Если у вас есть файл, который вы не хотите удалять, который не находится в том же формате, скорее всегоdate, у него будет отсутствующее значение, поскольку у него не будет даты в том месте, где вы ищете, и функции ввода ранее вернут отсутствующие значения. В SAS числовые пропущенные значения меньше, чем любые непустые числовые значения, поэтому это условие будет иметь значение true, за исключением файлов с именами в формате, который вы хотите удалить, которые имеют возраст менее 3 лет.

    Вы можете избежать пропущенных значений довольно легко, настраивая свой код так:

    if intnx('year', today(),-3,'S') > date and not(missing(date)) then do;