我有一个excel文件,需要定期导入到sas。列的名称位于第2行,列数可以更改。我正在使用以下查询:
proc import file = "file.xlsx"
out = sasfile
dbms= excel replace;
sheet = "sheet1";
range = "sheet1$A2:BE2000";
getnames = yes;
run;
但是,我继续在sas输出中获得F变量。如何仅动态输入具有名称的列?
答案 0 :(得分:2)
您是说如果该列在第二行中没有名称,那么您是否要从结果表中删除该列?
让PROC IMPORT读取未格式化为表的XLSX文件有点痛苦,因为它不支持NAMEROW,STARTROW,DATAROW等。但是你可以通过阅读来做到这一点。名称和数据分开。
首先让我们创建一些宏变量,使解决方案易于修改。
%let sheetname=SHEET1;
%let startrow=2;
%let lastrow=2000;
%let startcol=A;
%let lastcol=BE;
现在让我们读一下&STARTROW
的变量名。
proc import datafile='c:\users\abernathyt\downloads\book1.xlsx' replace
dbms=xlsx out=names1;
range="&sheetname.$&startcol.&startrow:&lastcol.&startrow";
getnames=no;
run;
然后转置它。
proc transpose data=names1 out=names2;
var _all_;
run;
现在让我们为要重命名的列生成old=new
对,以及我们要删除的列列表。
proc sql noprint ;
select case when col1 ne ' ' then catx('=',_name_,nliteral(trim(col1))) else ' ' end
, case when col1 ne ' ' then ' ' else _name_ end
into :rename separated by ' '
, :drop separated by ' '
from names2
;
quit;
现在让我们读入数据并添加数据集选项,以便在出路时重命名和/或删除列。
proc import datafile='c:\users\abernathyt\downloads\book1.xlsx' replace
dbms=xlsx out=want(rename=(&rename) drop=&drop)
;
range="&sheetname.$&startcol.%eval(&startrow+1):&lastcol.&lastrow";
getnames=no;
run;
答案 1 :(得分:0)
我认为你得到的是因为你明确地给了sheet
和range
只做了一个简单的文件并按预期导入了下面给出的sas代码
PROC IMPORT OUT= WORK.imported_file DATAFILE= "file.xlsx"
DBMS=EXCEL REPLACE;
GETNAMES=YES;
RUN;
如果您尝试从某一行开始,可以使用
实现namerow=2;
startrow=3;
答案 2 :(得分:0)
我不认为这是阻止proc import
创建命名F变量的简单方法。但导入后删除它们并不难。
首先,创建一个包含F变量的宏变量。我选择使用dictionary.columns表来查找以" F"开头的变量。并且只包含从第2个位置到名称末尾的数字。您不想删除名称为" flag"," F12_23"等变量的变量。或" f2var"。
* imported table in work.xl;
proc sql noprint;
select name into :fvars separated by ', '
from dictionary.columns
where
libname = 'WORK' and
memname = 'XL' and
name like 'F%' and
notdigit(strip(name), 2) = 0
;
quit;
然后使用alter table
删除变量。
proc sql;
alter table xl
drop &fvars;
quit;
这很直截了当。