sas宏在文件夹中读取多个multsheet excel

时间:2015-10-14 10:07:39

标签: sas

这是我在sas中读取多个多表格excel的代码,它给出了我在last.i中附加的错误。我只读取该特定文件夹中每个excel的第一张名为摘要

%macro sks2sas01(input=d:\excels,out=work.tt);    
/* read files in directory */
%let dir=%str(%'dir %")&input.%str(\%" /A-D/B/ON%');
filename myfiles pipe %unquote(&dir);
data list1; length fname $256.;
infile myfiles truncover;
input myfiles $100.;
/* put _infile_;*/
fname=quote(upcase(cats("&input",'\',myfiles)));
out="&out";
drop myfiles;
call execute('
PROC IMPORT DBMS=EXCEL2002 OUT= _1
DATAFILE= '||fname||' REPLACE ;
sheet="summary";
RUN;
proc append data=_1 base='||out||' force; run;
proc delete data=_1; run;
');
run;
filename myfiles clear;

%mend sks2sas01;

%sks2sas01(input=c:\sasupload\excels,out=work.tt);

特此我附上错误:

GOPTIONS ACCESSIBLE;
%macro sks2sas01(input=d:\excels,out=work.tt);
     /* read files in directory */
     %let dir=%str(%'dir %")&input.%str(\%" /A-D/B/ON%');
     filename myfiles pipe %unquote(&dir);
     data list1; length fname $256.;
     infile myfiles truncover;
     input myfiles $100.;
     /* put _infile_;*/
     fname=quote(upcase(cats("&input",'\',myfiles)));
     out="&out";
     drop myfiles;
     call execute('
     PROC IMPORT DBMS=EXCEL2002 OUT= _1
     DATAFILE= '||fname||' REPLACE ;
     sheet="summary";
     RUN;
     proc append data=_1 base='||out||' force; run;
     proc delete data=_1; run;
     ');
     run;
     filename myfiles clear;

     %mend sks2sas01;

     %sks2sas01(input=c:\sasupload\excels,out=work.tt);
ERROR: Insufficient authorization to access PIPE.
ERROR: Error in the FILENAME statement.

1 个答案:

答案 0 :(得分:0)

前几天我遇到了同样的问题。我没有pipe命令的授权,使用sftp的dir也不适用于我。这种替代解决方案对我很有用。简而言之,您将使用一些oldschool SAS目录命令来读取该目录中的每个文件,并仅保存以.xlsx结尾的文件。

您可以考虑Excel文件的名称. - 分隔,向后扫描每个文件的文件名,只查看第一个单词以获取那些Excel文件。例如:

File name.xlsx

向后:

 Delimiter
    v 
xlsx.name File
^^^^
First word

步骤1:阅读目录中的所有XLSX文件,并创建其中的数据集

filename dir 'C:\MyDirectory';

data XLSX_Files;
    DirID = dopen("dir");

    do i = 1 to dnum(DirID);
        file_name = dread(DirID, i);
        if(upcase(scan(file_name, 1, '.', 'b') ) = 'XLSX') then output;
    end;

    rc=dclose(DirID);

    drop i rc DirID;    
run;

第2步:将所有这些名称读入以管道分隔的宏变量

proc sql noprint;
    select file_name, count(file_name)
    into :XLSX_Files separated by '|',
         :tot_files
    from XLSX_Files;
quit;

第3步:在宏循环中导入所有内容

%macro import_all;
    %do i = 1 %to &tot_files;
        proc import file="C:\MyDirectory\%scan(&XLSX_Files,&i,|)"
            out=XLSX_&i
            dbms=xlsx replace;
        run;
    %end;
%mend;
%import_all;

然后,您可以根据需要堆叠或合并它们。

data Master_File;
    set XLSX_1-XLSX_&tot_files;
run;

OR

data Master_File;
    merge XLSX_1-XLSX_&tot_files;
    by key;
run;