导入具有特定范围的excel文件

时间:2017-02-20 11:52:13

标签: excel sas

我有很多excel文件,列数和行数不同。我想将它们导入SAS,但我想删除所有这些的第一行,第一列和最后两列。

我认为通过在导入步骤中使用“range”命令来完成此操作。但在那里,我必须使用特定的范围(例如B2:D5)。

有什么想法吗?

最佳

2 个答案:

答案 0 :(得分:0)

proc import datafile='~/testxl.xlsx' out=test replace dbms=xlsx;
   getnames=no;
   range='MYRANGE';
   run;

像这样。

答案 1 :(得分:0)

如果您使用的是PROC IMPORT DBMS=XLSX,则可以使用RANGE=可选语句限制其读取的文件部分。但是您需要以格式" sheetname $ start:end"指定范围,因此您需要知道要读取的XLSX文件中的工作表名称。

您可以使用XLSX libname引擎获取XLSX文件中的工作表名称。

libname in xlsx "&filename" ;
proc contents data=in._all_ noprint out=contents; run;

这也可以让你知道有多少列。

proc sql noprint ;
  select memname,max(varnum) into :sheetname trimmed,:ncols trimmed
  from contents group by 1 ;
quit;

要了解您需要读取数据的行数。

data _null_;
  if eof then call symputx('nrows',_n_);
  set in.&sheetname end=eof;
run;

使用此信息,您可以为PROC IMPORT构建RANGE =选项。

注意您需要将列数转换为XLSX列表示法(A,...,Z,AA,...,AZ)。因此,如果您的工作表有26列,那么最后一列是Z列,并消除您将通过X列读取的最后两列。

我们假设您已将%eval(&ncols-2)翻译成相应的列标签,并将结果存储在宏变量LASTCOL中。

所以你的最终PROC IMPORT现在变为:

proc import dbms=xlsx datafile='&filename" replace out=want ;
  range="&sheetname$b2:&lastcol.%eval(&nrows-1)" ;
run;