我有很多excel文件,列数和行数不同。我想将它们导入SAS,但我想删除所有这些的第一行,第一列和最后两列。
我认为通过在导入步骤中使用“range”命令来完成此操作。但在那里,我必须使用特定的范围(例如B2:D5)。
有什么想法吗?
最佳
答案 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;