仅当列具有名称时,SAS才会导入xls

时间:2016-01-17 01:09:44

标签: sas

我有一个excel文件,需要定期导入到sas。列的名称位于第2行,列数可以更改。我正在使用以下查询:

proc import file = "file.xlsx"
out = sasfile
dbms= excel replace;
sheet = "sheet1";
range = "sheet1$A2:BE2000";
getnames = yes;
run;

但是,我继续在sas输出中获得F变量。如何仅动态输入具有名称的列?

3 个答案:

答案 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)

我认为你得到的是因为你明确地给了sheetrange只做了一个简单的文件并按预期导入了下面给出的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;

这很直截了当。