2015-10-16 101 views
0

我刚开始学习SAS和我使用下面的代码读取XLSX文件:读取n个文件到SAS来创建n个数据集

proc import out = data_lib.dataset_1 
    datafile = 'C:\data_folder\data_file_1.xlsx' 
    dbms = xlsx replace; 
    sheet = 'Sheet1'; 
    getnames = yes; 
run; 

这一直是我工作的罚款,但我d喜欢为代码提供要读取的文件名列表以及要创建的数据集名称列表,以便代码只需要出现一次。我查看了几个关于使用宏的教学网页,但是我一直无法将这些信息翻译成工作代码。任何帮助将不胜感激。我正在使用SAS 9.4,64位。

回答

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; 
+0

您的解决方案工作完美,并且还将我介绍给了连接操作员! – Robert

+0

我通常会使用其中一个连接函数,但我认为它更容易用'||'运算符进行读取。 – DWal

1

因此,假设你有你在一个名为t_list与VARIABLENAME数据集名称和文件名,表名和datanames,你可以尝试这样的事:

%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和listname并用数字后缀创建宏变量。你只需要为条目数量创建一个宏变量,所以我在n = 1时做了这个,你也可以在eof上做到这一点。

然后你有一个do循环,每一个循环你读取特定的excel并写入特定的数据集。 你需要把它写这样& & LIBNAME &我,因为在第一次被解析为& libname_1,并在此之后解析到variablevalue ...

+0

虽然我接受另一个答案,因为它的紧凑性,您的解决方案将帮助我了解更多关于编写宏的信息。 – Robert