SAS批量读入Excel+批量修改变量名

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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');

相关文档
最新文档