import
過程接受由filename
語句創建的fileref,並且filename
語句接受多個文件。因此,你可以做到以下幾點:
filename csvs ('file1.csv', 'file2.csv', 'file3.csv', 'file4.csv');
proc import out=work.data
datafile = csvs
DBMS=CSV REPLACE;
GETNAMES=YES;
DATAROW=2;
run;
我不能完全肯定這將如何與多個CSV的每一個有一個標題的工作,但我似乎記得SAS識別每個新文件,並跳過第一行作爲根據您的DATAROW=2
聲明。
或者您可以使用宏來遍歷文件夾中的所有文件,導入它們,並將它們附加到您的主集中。 This answer here應該可以幫助您獲取文件夾中所有文件的列表。然後,你可以這樣做:
%macro importcsvs (folder, outputname);
/* I assume this is your macro that takes a folder and returns a dataset */
/* (called filelist) containing the filename in variable: file */
%getallfilesinfolder(&folder, filelist);
/* determine number of files to read */
%let numfiles=0;
data _null_;
set filelist end=last;
if last then call symput('numfiles',put(_n_,best.));
run;
%do i=1 %to &numfiles;
%let curfile=;
data _null_;
/* obs and firstobs =i mean you only read item i in the dataset */
set filelist (obs=&i firstobs=&i);
call symput('curfile',file);
run;
filename csv "&curfile";
proc import out=work.data
datafile = csv
DBMS=CSV REPLACE;
GETNAMES=YES;
DATAROW=2;
run;
data work.&outputname;
set
%if %sysfunc(exist(work.&outputname)) %then %do;
work.&outputname
%end;
work.data;
run;
%end;
%mend;
%importcsvs(/your/folder/with/csvs, newData);
生成的代碼一個好的技巧與PROC IMPORT是使用運行 - >調用最後提交在IDE中。這會將生成的代碼放在活動代碼窗口的頂部。 – DomPazz
很好,謝謝。當我使用firstobs = 2時,它只跳過第一個文件的第一行(其中包含變量名稱),幷包含後續文件的第一行,導致一堆缺失值。有沒有辦法解決? – user2816263
是的,有點。您可以使用幾個選項之一('eov'或'filename')來查看文件何時更改,以及何時有選擇地跳過記錄。然而,你需要一個簡單的輸入('input @;')來觸發前一個文件的結尾(SAS在讀取另一行之前不會看到它)。 – Joe