2016-11-13 73 views
0
%let dirname = C:\Users\data; 
filename DIRLIST pipe 'dir/B &dirname\*.dbf'; 

/* Create a data set with one observation for each file name */ 
data dirlist; 
    length fname $8.; 
    infile dirlist length=reclen; 
    input fname $8.; 
run; 

data all_text (drop=fname); 
set dirlist; 
filepath = "&dirname\"||fname||".dbf"; 
infile dummy filevar = filepath length=reclen end=done missover; 
do while(not done);  
INPUT 
F1    : 2. 
F2    : 2. 
F3    : 2. 
F4    : 10. 
F5    : 4.; 
output;   
end;  
run; 

問題是,它只是讀取每個文件的第一行,而不是整個文件,然後再轉到下一個文件。變量F1也顯示爲丟失。如何導入SAS中的多個.dbf文件

歡迎提出建議

+0

我試圖使用宏和管道在SAS中導入多個.dbf文件。我之前已經使用在線提供的標準代碼,針對不同的文件格式完成此操作,但我無法爲.dbf文件執行此操作。 我的數據結構如下,它對於所有文件 變量都是一樣的:A-數字長度2; B - 數字長度2; c - 數字長度2; D - 最大數字長度10;電子數字長度4; 此外,每個文件名都遵循xxx_xxxx.dbf –

+0

您的代碼用於讀取文本文件。要讀取DBF文件,請使用PROC IMPORT而不是DATA STEP。 – Tom

+0

我相信我一次可以對一個文件使用PROC IMPORT。但是我需要導入超過300個.dbf文件並將其附加到一個文件中。使用PROC IMPORT進行編碼的示例代碼將非常有幫助 –

回答

1

所以一個標準的PROC進口將是:

proc import out=sample1 datafile="path to dbf file.dbf" dbms=DBF replace; 
run; 

現在的問題,是如何產生這組代碼在文件列表中的每個文件。使用@Tom的CALL EXECUTE語句是你最好的選擇。您也可以使用CALL EXECUTE創建一個小宏,併爲每個文件名調用它。如果您是SAS新手,可以更容易理解。

*Create a macro that imports the DBF 

%macro import_dbf(input= , output=); 

    proc import out=&out datafile="&output" dbms=DBF replace; 
run; 

%mend; 

然後從數據集中調用宏。我正在命名數據集DBF001,DBF0002等。

%let dirname=C:\_localdata; 

data dirlist; 
    informat fname $20.; 
    input fname; 
    cards; 
    data1.dbf 
    data2.dbf 
    data3.dbf 
    data4.dbf 
    ; 
run; 

data out; 
    set dirlist; 
    str=catt('%import_dbf(input="', "&dirname", '\', fname, '", output=dbf', 
     put(_n_, z4.), ');'); 
run; 

proc print data=out; 
run; 
1

將它們一個一個地導入然後合併它們。

%let dirname = C:\Users\data; 
data filelist ; 
    infile "dir /b &dirname\*.dbf" pipe truncover end=eof; 
    fileno + 1; 
    input fname $256. ; 
    tempname = 'temp'||put(fileno,z4.); 
    call execute(catx(' ','proc import replace dbms=dbf' 
     ,'out=',tempname,'datafile=',quote(trim(fname)),';run;' 
)); 
    if eof then call symputx('lastname',tempname); 
run; 
data want ; 
    set temp0001-&lastname; 
run;