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

将n个文件读入SAS以创建n个数据集,sas,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,我正在使用以下代码读取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位。

因此,假设您的文件名和数据名位于一个名为t_list的表中,其中包含variablename数据集名和文件名,您可以尝试以下操作:

 %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,然后解析为variablevalue…

我会提供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;

虽然我接受了另一个答案,因为它的紧凑性,你的解决方案将帮助我学习更多关于编写宏的知识。你的解决方案工作得非常好,还向我介绍了连接运算符!我通常会使用其中一个串联函数,但我认为使用
|
运算符更容易阅读。