将n个文件读入SAS以创建n个数据集

时间:2015-10-16 19:42:16

标签: sas

我刚刚开始学习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位。

2 个答案:

答案 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;