我刚刚开始学习SAS,并且我使用以下代码来阅读xlsx文件:
proc import out = data_lib.dataset_1
datafile = 'C:\data_folder\data_file_1.xlsx'
dbms = xlsx replace;
sheet = 'Sheet1';
getnames = yes;
run;
这对我来说一直很好,但是我想提供一个要读取的文件名列表和要创建的数据集名称列表,以便代码只需要出现一次。我查看了几个关于使用宏的教学网页,但我还是无法将这些信息转换为工作代码。任何帮助将不胜感激。我使用SAS 9.4,64位。
答案 0 :(得分:1)
所以,假设你的文件名和数据名在一个名为t_list的表中,其变量名为datasetname和filename,你可以尝试这样的事情:
%macro readexcels;
data _null_;
set t_list (nobs=nobs);
call symputx(cat("libname_",_n_), datasetname);
call symputx(cat("filename_",_n_), filename);
if _n_=1 then
call symputx("nobs", nobs);
run;
%do i=1 %to &nobs;
proc import out = &&libname_&i;
datafile = "&&filename_&i"
dbms = xlsx replace;
sheet = 'Sheet1';
getnames = yes;
run;
%end;
%mend;
%readexcels;
在datastep中,您使用datasetname和listname读取表的每个条目,并使用数字后缀创建宏变量。您只需要为条目数创建一次宏变量,所以我在 n = 1时执行此操作,您也可以在eof上执行此操作。
然后你有一个do循环,每个循环都会读取特定的excel并将其写入特定的数据集。 您需要像&& libname& i一样编写它,因为首先这会解析为& libname_1,然后解析为变量值...
答案 1 :(得分:1)
我提供了kl78建议的修改版本,避免使用宏。同样,假设您在SAS数据集中有文件名,请使用数据步骤读取文件名列表,并使用call execute
为每个文件名运行proc import
代码。
data _null_;
set t_list;
call execute (
"proc import out = " || datasetname || "
datafile = '"|| filename ||"'
dbms = xlsx replace;
sheet = 'Sheet1';
getnames = yes;
run;");
run;