SAS中文论坛

标题: 请教一个利用宏导入excel数据的问题 [打印本页]

作者: shiyiming    时间: 2004-5-8 19:01
标题: 请教一个利用宏导入excel数据的问题
1、现在想将文件夹中的一些excel文件导入到一个数据集中,比如文件名为:记录表001.xls,记录表002.xls,...记录表980.xls,利用宏该如何进行?(excel文件中的数据格式都相同)

2、每一个excel文件中又有多个sheet,比如,对于记录表001.xls,有sheet1,sheet2,sheet3,如果每一次只读一个指定的sheet,该怎么写这个程序?

3x!
作者: shiyiming    时间: 2004-5-9 00:37
ugly code <!-- s8) --><img src="{SMILIES_PATH}/icon_cool.gif" alt="8)" title="Cool" /><!-- s8) -->

[code:3f7a2]%macro mimport;
%let str=&quot;&quot;;
%let testdata=;
%do i=1 %to 198;
%if &amp;i&lt;10 %then %let str=00&amp;i&#46;;
%else %if &amp;i&lt;100 %then %let str=0&amp;i&#46;;
%else %let str=&amp;i;
proc import datafile=&quot;d&#58;\data\记录表&amp;str&#46;&#46;xls&quot;
out=outdata replace;
sheet=&quot;sheet1&quot;;
getnames=yes;
quit;

data sasuser&#46;test;
set &amp;testdata outdata;
run;
%let testdata=sasuser&#46;test;
%end;

%mend mimport;
%mimport;[/code:3f7a2]
作者: shiyiming    时间: 2004-5-10 14:22
好像不行呀,log如下:



[quote:e14bb]64   %macro mimport;
65   %let str="";
66   %let testdata=;
67   %do i=1 %to 198;
68   %if &amp;i&lt;10 %then %let str=00&amp;i.;
69   %else %if &amp;i&lt;100 %then %let str=0&amp;i.;
70   %else %let str=&amp;i;
71   proc import datafile="d:\data\记录表&amp;str..xls"
72   out=outdata replace;
73   sheet="sheet1";
74   getnames=yes;
75   quit;
76
77   data sasuser.test;
78   set &amp;testdata outdata;
79   run;
80   %let testdata=sasuser.test;
81   %end;
82
83   %mend mimport;
84   %mimport;

ERROR 22-322: Expecting a name.
ERROR 76-322: Syntax error, statement will be ignored.
ERROR: Import unsuccessful.  See SAS Log for details.
NOTE: The SAS System stopped processing this step because of errors.
NOTE: PROCEDURE IMPORT used:
      real time           0.37 seconds
      cpu time            0.32 seconds



ERROR: File WORK.OUTDATA.DATA does not exist.

NOTE: The SAS System stopped processing this step because of errors.
WARNING: The data set SASUSER.TEST may be incomplete.  When this step was stopped there were 0
         observations and 0 variables.
WARNING: Data set SASUSER.TEST was not replaced because this step was stopped.
NOTE: DATA statement used:
      real time           0.01 seconds
      cpu time            0.01 seconds[/quote:e14bb]
作者: shiyiming    时间: 2004-5-10 16:43
标题: 试试这个。
[quote=&quot;Jerry&quot;:b9503]ugly code <!-- s8) --><img src="{SMILIES_PATH}/icon_cool.gif" alt="8)" title="Cool" /><!-- s8) -->
%if &amp;i&lt;10 %then %let str=00&amp;i.;
%else %if &amp;i&lt;100 %then %let str=0&amp;i.;
%else %let str=&amp;i;
proc import datafile="d:\data\记录表&amp;str..xls"
%mimport;[/quote:b9503]

把上面一段代码改成:
%if &amp;i&lt;10 %then %let file="d:\data\记录表00%eval(&amp;i).xls";
%else %if &amp;i&lt;100 %then %let %let file="d:\data\记录表0%eval(&amp;i).xls";
%else  %let file="d:\data\记录表%eval(&amp;i).xls";

proc import datafile=&amp;file

似乎是可以地~
作者: shiyiming    时间: 2004-5-18 20:31
还有一点问题:就是该文件夹中需要导入的文件如记录表001.xls,记录表002.xls,...记录表980.xls并不是连续的,(比如说记录表100-记录表150.xls并不存在),如果宏从1-980全部扫描一遍的话,可能会浪费许多时间,能不能先判断出该文件夹中哪些文件存在,然后只将存在的文件利用宏导入?
作者: shiyiming    时间: 2004-5-18 20:36
Firstly,thanks for shiyiming &amp; qkaiwei's help ,现把一个完整的程序放在这里,与大家共享:)

[code:fbb82]filename filein pipe 'dir d&#58;\temp /b';

data _null_;
    infile filein truncover end=last;
    length f_name1 $ 60 ;
    input f_name1 $ ;
    i+1;
    call symput&#40;'Fname'||trim&#40;left&#40;put&#40;i,8&#46;&#41;&#41;&#41;,trim&#40;left&#40;f_name1&#41;&#41;&#41;;
    call symput&#40;'Pname'||trim&#40;left&#40;put&#40;i,8&#46;&#41;&#41;&#41;,trim&#40;left&#40;f_name1&#41;&#41;&#41;;
    if last then call symput&#40;'total',trim&#40;left&#40;put&#40;i,8&#46;&#41;&#41;&#41;&#41;;
run;

%MACRO Mult_Files&#40;Out_set=&#41;;
    %LOCAL i ;
    %DO i = 1 %TO &amp;total;
    proc import datafile=&quot;d&#58;\temp\&amp;&amp;Pname&amp;i&quot;
       out=_temp
       dbms=excel2000 replace;
       getnames=yes;
       sheet=&quot;sheet1&quot;;
     data _temp ;
       set _temp;
    file = &quot;&amp;&amp;Fname&amp;i&quot;;
    data &amp;out_set ;  
      set &amp;out_set _temp ;
   run;
  %END ;
    data &amp;out_set ;
      set &amp;out_set;
     run;
%MEND Mult_Files ;

%mult_files&#40;out_set=record&#41; [/code:fbb82]

整个程序中会产生2个数据集,一个是最后需要的汇总数据集out_set,另外一个_temp则为临时数据集。

感觉上要是能采用proc sql 优化一下,直接生成最后所需要的汇总数据集就好了,不知可行否?




欢迎光临 SAS中文论坛 (http://mysas.net/forum/) Powered by Discuz! X3.2