2016-10-04 59 views
0

我想從文件夾中刪除具有3年舊文件的文件。但是,當我運行代碼時,它也刪除了其他文件,這些文件不是我嘗試刪除的文件名frmat。文件名是一樣SFRE_BIL_SIT_20160812_134317_PAM_FILES1.zip我重視的代碼也與此刪除使用sas的3年舊文件

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; 

回答

0

我可以看到在你的代碼中的至少一個錯誤,可能會導致意外的行爲:

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中,數字缺失值小於任何非缺失數值,因此除了名稱爲要刪除的格式小於3年的文件外,此條件將評估爲true。

您可以通過調整像這樣的代碼避免遺漏值相當容易:

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

感謝您的幫助,它的工作 – Manesh

+0

請註明答案所接受,如果你有幫助,並考慮upvoting它 - 它是如何現場作品。 – user667489