全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
4639 15
2010-04-21
悬赏 1 个论坛币 已解决
我写了一个简单的宏

%macro fileinput(file_name);
       proc import file = XXX
out=&file_name dbms=excel replace;
                   sheet=&file_name;
                   getnames=yes;
       run;
       data &file_name ;
              set &file_name;
              exp = input(value,
10.
);
              where id~=
.
;
       run;
       proc sql;
              create table n_&file_name as
              select avg(exp) as p&file_name, count(id) as n&file_name
              from &file_name
              where A = B;
%mend fileinput;

然后我想引用此宏1000次,比如文件名为‘北京,上海,台北,香港,天津,重庆,斯里兰卡,纽约,东京,新德里。。。。。’一千个。

请问高手怎么做?谢谢。

最佳答案

yatming 查看完整内容

宏参数是sheet名字,也就是说是一个指定excel中有一千个sheet。此代码是依赖于你定义的那个简单宏而写的。 %fileinput这个宏可以再简单些,proc import的语句可以不需要。后面稍作修改就可以
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2010-4-21 10:07:18
宏参数是sheet名字,也就是说是一个指定excel中有一千个sheet。
复制代码
此代码是依赖于你定义的那个简单宏而写的。
%fileinput这个宏可以再简单些,proc import的语句可以不需要。后面稍作修改就可以
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-4-21 10:24:41
额 我以为一个excel最多256个表呢,原来限定早解除了
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-4-21 10:52:30
data excelname ;
filename excelname pipe  'dir  c:\crackman/b'; /*b不能去,这个为你存放excel文件的文件夹名*/
length excelname $20.;
infile excelname truncover;
input name $30.;
obs=_n_;
excelname=compress(name,'.xls');/*获取文件夹下的excel文件名,如果你的所有文件都是sheet,放在一个xls文件下就不行*/
run;
proc sql noprint;
select count(*) as count into:count from excelname ;/*获得有多少个xls文件*/
%crackman(&count.);
quit;
%macro crackman (count); /*循环语句,调用宏fileinput,把数据集中excelname中的excel那么作为参数传递进去*/
%do i=1 %to &count.;
proc sql noprint;
select excelname into:file_name from excelname where obs=&i.;
%fileinput(&&file_name.);
quit;
%mend crackman;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-4-21 11:08:15
4# crackman
pipe确实是好办法,不过,注意楼主的宏中,import的file option应该是写死的,宏参数file_name实际是sheet的名字。
所以这个更可能是一个excel中有多个sheet导入问题,而不是多个excel文件的导入问题。
管道语句还需依赖sas所处操作系统,windows是dir,linux就是ls了。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-4-21 11:27:41
%do i=1 to &cnt;
%let memname=%scan(&memlist,1,*);
%let leg=%eval(%length(&memname)-1);
%let mem=%substr(&memname,1,&leg);
%fileinput("&memname");
%end;
这个部分是我一直很疑惑 的部分
我的理解是不是可以改成
%let memname=%scan(&memlist,&i.,*);
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群