加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

SAS批量导入,数据的批量合并与拆分

(2014-01-08 17:19:37)
标签:

教育

分类: 03SAS数据处理

教你个简单的方法,在文件夹里新放一个空的excel,然后全选所有的文件,在你新建的excel上鼠标右键,重命名,随便起个名字,然后所有的文件就有规律了,有规律后使用下面的宏。
TXT:
%macro excel(datapath=,dataname=,datanum=);
%do i=1 %to &datanum;
proc import datafile="&datapath&dataname (&i).txt"
out=&dataname&i DBMS=tab REPLACE;
GETNAMES=YES; DATAROW=2; 
%end;
%mend;
%excel(datapath=d:\car\,dataname=a,datanum=3);
quit;
EXCEL:
%macro excel(datapath=,dataname=,datanum=);
%do i=1 %to &datanum;
proc import datafile="&datapath&dataname (&i).xls"
out=&dataname&i replace;
%end;
%mend;
%excel(datapath=C:\Documents and Settings\chao\桌面\上海宝山\生化结果\,dataname=bs_sh,datanum=8);

现有近100个excel文件,目前一个宏已经将excel文件名读取,现在我要将所有的excel的数据读入到一个sas数据集中,excel的数据格式都是一样的.
假设你存放excel文件名的数据集在work下面,并且名字是test:

proc sql noprint;
select distinct scan(name,1,'.') into: ds separated by ' '
from test;
quit;

data _null_;
set test;
code="proc import datafile='D:/"||strip(name)||"' out="||scan(strip(name),1,'.')||" replace;run;";
call execute(code);
run;

data wanted;
set &ds;
run;

我现在有一个数据文件,总共4亿3千多万行,我想拆成每个有一千万行的数据文件,这样方便我导出txt文件打开。
%macro splitdata(n = , step = );
data %do i = 1 %to &n; test&i %end;;
        set all;
        %do i = 1 %to &n;
        if (&i - 1) < _N_/&step <= &i then output test&i;
        %end;
run;
%mend;
%splitdata(n = 44, step = 10000000);

或者
%macro splitdata(n = , step = );

data %do i = 1 %to &n; test&i %end;;
        set all;
                if _N_ <= &step then output test1;
        %do i = 2 %to &n;
                else if _N_ <= (&i * &step) then output test&i;
        %end;
run;
%mend;
%splitdata(n = 44, step = 10000000);

或者:
%macro smallfiles(n=, step=);
   %do  i = 1 %to &n;
        %let firstobs = %eval_r((&i - 1)*&step+1);
        %let obs= %eval_r(&i * &step);

        data small&i;
           set big (firstobs=&firstobs obs=&obs);
        run;

   %end;
%mend smallfiles;
%smallfiles(n=44, step=10000000);

把一个数据拆分为多个数据,按照一定的编码:
%macro arr(r);   
%do i=1 %to &r;
data out&i.;
set match01;
if num=&i.;
run;

data kk&i.;
merge  out&i.(in=a) samplexiao(in=b);
by date nnindcd;
if a=1 and b=1;
run;

data ff&i.;
set kk&i.;
chaju=ABS(B001100000-B001100000_sm);
run;

proc sort data=ff&i.;
by chaju;
run;

%end;
%mend arr;

%arr(67);

data dd.final;
set ff1-ff67;
run;


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有