如何在 SAS 中导入多个 .dbf 文件
How to import multiple .dbf files in SAS
%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 .;
infile dirlist length=reclen;
input fname .;
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 也显示为缺失。
欢迎提出建议
一个一个导入,然后合并。
%let dirname = C:\Users\data;
data filelist ;
infile "dir /b &dirname\*.dbf" pipe truncover end=eof;
fileno + 1;
input fname 6. ;
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;
所以标准的 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 .;
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;
%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 .;
infile dirlist length=reclen;
input fname .;
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 也显示为缺失。
欢迎提出建议
一个一个导入,然后合并。
%let dirname = C:\Users\data;
data filelist ;
infile "dir /b &dirname\*.dbf" pipe truncover end=eof;
fileno + 1;
input fname 6. ;
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;
所以标准的 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 .;
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;