SAS批量读入Excel+批量修改变量名
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
收集了N多Excel表格,如何将他们汇总在一块儿呢?
如果会VBA,这或许也不是一件难事,事实上有些Excel插件就可以解决这个问题。这里看看如何用SAS来解决
/*指定需要合并的文件的路径*/
%let path=D:\test;
/*注意dir后面与路径之间要有空格*/
filename files pipe "dir&path /b";
/*读入文件名列表*/
data test;
infile files truncover;
input name $96.;
run;
/*获取文件名宏变量和文件个数宏变量*/
procsqlnoprint;
select scan(name,1,';'),count(name) into: filenames separated by ';',:n from test;
quit;
/*循环读入Excel文件*/
%macro infiles;
%local i;
%do i=1 %to &n;
proc import datafile="&path.\%scan(&filenames,&i,';')" out=_a&idbms=excel replace;run;
%end;
%mend;
%infiles
/*合并文件*/
/*这一步也可以放在上面的循环中处理*/
%macro appends;
%local i;
%do i=2 %to &n;
proc append base=_a1 data=_a&i ; run;
%end;
datafiles;set _a1;run;
%mend;
%appends;
/*删除文件*/
proc datasets lib=work nolist ;
delete _a: / memtype=data;
quit;
如果是遇到这样的表头呢?好吧,当然也是可以正确读入的。
libname local "d:\test";
%let in_file_path=d:\test;
%macro in_file(in_file_name,read_sheet_name,fstobs,out_file_name);
proc import out=&out_file_name
file="&in_file_path\&in_file_name"
dbms=excel replace;
dbdsopts='firstobs=&fstobs';
getnames=no;
scantext=yes;
usedate=yes;
sheet=&read_sheet_name;
scantime=yes;
dbsaslabel=none;
run;
%mend;
%in_file(20150122-XXXX 花名册 - (3)副本.xlsx,在职名册,4,hr);
/*如果不加dbsaslabel选项,打开数据集时会发现字段名称为A,B,C...打开缓慢,会导致SAS崩溃*/
/*建议使用office2013及以上*/
读入后发现字段名是这样的,没有任何意义,怎么批量改?
/*批量修改变量名*/
/*应用场景:*/
/*读入带有中文列名的Excel表格时,会产生例如_col1,var1,F1等形式的字段名,这往往不是所需要的*/
/*一个一个rename比较麻烦,可以采取批量修改的方式,特别是读入表格较多的时候*/ /*注意:新的字段名需要与原字段名位置相对应,逻辑库和数据集名称需要大写*/
/*%rename(WORK,A,'aa bb cc ddeeffgghh');*/
/*例如要将 a b c d e f g h 修改为 aa bb cc ddeeffgghh*/
data a;
input a b c d e f g h;
stop;
cards;
;
run;
%macro rename(lib,dsn,newname);
data&LIB..&dsn._copy;
set&LIB..&dsn.;
run;
procsqlnoprint;
selectnvar into :num_vars
fromdictionary.tables
wherelibname="&LIB" and memname="&DSN";
select distinct(name) into :var1-:var%trim(%left(&num_vars))
fromdictionary.columns
wherelibname="&LIB" and memname="&DSN";
quit;
proc datasets library = &LIB;
modify&DSN;
rename
%do i = 1 %to &num_vars.;
&&var&i = %scan(&newname,&i,' ')
%end;
;
quit;
%mend rename;
%rename(WORK,A,'aa bb cc ddeeffgghh');