使用 SAS EG 的 3 種 Delete 功能自動化刪除檔案,告別手動刪除越積越多的資料!
內容目錄
ToggleAuthor:Omniwaresoft / Data and Analytics team / Kane Tu
#SAS #EG #Delete #Function #刪除
如何利用 SAS Delete 功能管理檔案
根據專案內容與客戶需求,有些資料來源會以日批產檔的方式每天落地 1 份檔案,也因此每年都會有 365 個檔案存在指定目錄裡,若在一開始沒有規劃好檔案管理這一環節,該目錄便容易隨著時間越來越多檔案、佔據更多的硬體容量。若檔案讀取的數量逐漸增多,ETL 過程便需要藉助 Function 來做更有效率的資料處理。
下圖為全部流程,本篇著重在 SAS EG(Enterprise Guide) 並應用 3 種 Delete (標記紅色格子的 Funtion 1 ~ Function 3)來實現檔案刪除、資料刪除及釋放運算空間的功能。
- Funtion 1:應用 FDELETE Function 將指定檔案刪除。
- Funtion 2:應用 SQL Procedure – DELETE Statement 在 ETL 過程刪除不需要用到的資料列。
- Funtion 3:資料處理結束後,應用 Delete Procedure – PROC DELETE Statement 刪除已使用完畢的暫存表(Temporary Table),釋放運算空間。

Delete 功能介紹
進入情境演示前,先簡單介紹三種不同的 Delete 功能與語法。
1. FDELETE Function
刪除外部檔案或是空白目錄
FDELETE(fileref | directory)
2. SQL Procedure – DELETE Statement
運用 SQL FROM 語法來刪除 Table 的資料列(row)
DELETE FROM table-name | sas/access-view | proc-sql-view
<AS alias>
<WHERE sql-expression>;
3. Delete Procedure – PROC DELETE Statement
刪除 SAS 資料館當中的 Table
PROC DELETE <LIBRARY=libref> DATA=SAS-file(s)
(<GENNUM=ALL | HIST | REVERT | integer>
<MEMTYPE=member-type>
<ENCRYPTKEY=key-value>
<ALTER=alter-password>);
使用者情境(User Context)
了解 Delete 功能後,我們回到一開始設定的情境中,我們的目標是「蒐集並運用近 1 年資料,最後使用 Tableau 報表呈現這些資料」。
以下為本次情境條件與設置:
- 資料來源端每天固定在 7 點左右落地 1 份當日原始資料(Raw Data)檔案在指定目錄裡。
- 已設定每日 8 點 Windows 工作排程自動執行 SAS 程式。
- 已確定 1 年之後的資料不會再使用到,可以進行刪除。
- 每天 ETL 結束後需落地並直接取代舊的 BigTable.csv。
- Tableau 工作簿讀取 BigTable.csv 並呈現報表。
情境假設:
- CARS 資料集每日落地 1 份當日原始資料檔案在 E 槽 test 資料夾,檔案命名規則為 cars_YYYYMMDD.csv。例如在 20221214 落地的檔案,檔名就會是 cars_20221214.csv。
- 彙總表 BigTable 已先創建 Table 在 SAS 環境。
以下會依照流程圖依序演示,內容聚焦在 SAS 的 3 種 Delete 來實現檔案刪除、資料刪除及釋放運算空間的功能,並運用 SAS 內建資料集 – SASHELP.CARS 做程式範例,關於資料集的詳細內容請參考:SAS Help Data Sets 。
流程圖 – FDELETE Function (Funtion 1)

以日期 20221214 為例,往前回推一年的日期會是 20211214,因此只要 Test 資料夾裡面有 20211213 的資料,就不是 Tableau 報表的來源資料,可以刪除。
設置 1 個變數 DAY366AGO 當作超過 1 年的日期變數,再應用 FDELETE Function 把超過一年的 csv 檔,也就是 cars_20211213.csv 刪除掉,便能實現刪除超過 1 年的檔案。
%LET DAY366AGO = %SYSFUNC(INTNX(DAY, %SYSFUNC(DATE()), -366), YYMMDDN8.);
%PUT &DAY366AGO.;
DATA _NULL_;
FNAME = "SAMPLE";
RC = FILENAME(FNAME, "E:\\test\\cars_&DAY366AGO..csv");
IF RC = 0 AND FEXIST(FNAME) THEN /* 檢查指定目錄是否有超過一年的 csv 檔 */
RC = FDELETE(FNAME); /* 刪除超過一年的 csv 檔 */
RC = FILENAME(FNAME);
RUN;
流程圖 – SQL Procedure – DELETE Statement (Funtion 2)

匯入(import)最近 1 年的檔案,也就是需要匯入 365 個 csv 檔案。
下面就僅以匯入今日 (20221214) 落地檔案,也就是 cars_20221214.csv 為範例。
成功匯入檔案之後,此情境是想知道 來源地(Origin)在 亞洲(Asia)
的資料,換句話說:來源地不是在亞洲的資料就都可以刪除。便能應用 SQL Procedure – DELETE Statement 刪除不需要用到的資料列。
/* 匯入 csv */
%LET TODY = %SYSFUNC(DATE(), YYMMDDN8.); /* 今日的日期變數 */
%PUT &TODY.;
PROC IMPORT FILE = "E:\\test\\cars_&TODY..csv"
OUT = WORK.CARS_&TODY.
DBMS = csv
REPLACE;
GETNAMES = YES;
RUN;
/* SQL Procedure - DELETE Statement */
PROC SQL;
DELETE FROM WORK.CARS_&TODY.
WHERE Origin NOT IN ('Asia'); /* 刪除 Origin 不在 Asia 的所有資料 */
RUN;
流程圖 – Delete Procedure – PROC DELETE Statement (Funtion 3)

經過上述的 SQL Procedure – DELETE Statement 的資料處理流程,下一步流程便是將 WORK.CARS_20221214 插入(insert into)到 BigTable 裡。
當成功插入 BigTable 後,WORK.CARS_20221214 這張 Table 就已經不會再使用到,之後就能應用 Delete Procedure – PROC DELETE Statement 將 WORK.CARS_20221214 從 SAS 運算空間釋出。
/* 刪除在 WORK 資料館的 CARS_20221214 */
PROC DELETE DATA = WORK.CARS_&TODY.;
RUN;
QUIT;
結論
透過 3 種 Delete,控制指定資料夾占硬體容量在一定範圍,且在 ETL 過程中只保留需要做資料處理的內容,並且在使用完畢後,將不會再用到的 Table 刪除來釋出運算空間。
參考資料
- FDELETE Function
- SQL Procedure – DELETE Statement
- Delete Procedure – PROC DELETE Statement
- PROC IMPORT Statement
- SAS Help Data Sets