具有动态命名范围的SAS PROC导入

时间:2017-05-11 05:55:25

标签: excel sas named-ranges

我有一个包含数据库信息的工作簿,该数据库信息被拆分为各种选项卡,我想将其导入SAS以进一步操作。

这些数据库表的维度因标签而异,此外,在整个项目任期内,表格的维度可能会有进一步的变化。

因此,我在每个标签中都设置了动态命名范围,以便它获取我需要的确切尺寸,即我的命名范围TBL_SHEET1

=OFFSET(SHEET1!$A$1,0,0,COUNTA(SHEET1!$A:$A),COUNTA(SHEET1!$1:$1)-2)

现在的SAS问题是,当我使用proc导入代码时,它似乎并不认为这些命名范围"存在"并在日志中返回失败消息。

有解决方法吗?或者只是限制SAS与Excel通信的方式?

(作为旁注,我不仅仅是导入整个标签的原因是因为右边有一些额外的列我要从导入中排除)

我的SAS导入代码:

proc import 
out= rwork.SHEET1
datafile = "C:\My User\Sample.xlsx"
dbms= excel replace;
range=TBL_SHEET1.;
getnames=yes;
run;

2 个答案:

答案 0 :(得分:0)

添加代码真的会有所帮助。但是,如果我理解你的问题是正确的,问题在于导入命名范围。以下是如何将用户定义的命名范围导入SAS的示例。

在下面的示例中,我选择范围A1:C7并将范围命名为Test

enter image description here

现在,要将名​​称范围Test导入SAS,

PROC IMPORT OUT= WANT
DATAFILE= "C:\Desktop\Test.xls"
DBMS=XLS REPLACE;
RANGE="Test";
GETNAMES=YES;
RUN;

在上面的代码中,Range告诉SAS从命名范围Test下的excel导入数据。您还可以自动执行代码并将动态名称范围的多个Excel工作表导入SAS

例如,我在Excel中有多个工作表要导入SAS,我将使用以下代码将spreadsheets带到SAS

# Assigning Library #

Libname Test "C:\Desktop\Test.xls";

# Creating a table to select sheet names in above library #

Proc sql;
create table test_excel as 
select * 
from dictionary.tables
where libname="Test" ;
Quit;

# Assigning count and Sheet names to macros#

## Sheet names ##

Proc sql;
select memname into: list seperated by '*'
from test_excel 
;
quit;

## Number of sheets ##

Proc sql;
select count(memname) into:count 
from test_excel 
;
quit;

# Macro to import  #

options mprint;
%macro import;
%do i=1 %to &count;
%let var=%scan(&list,&i,*);

PROC IMPORT OUT= %substr(&var,1,%length(&var)-1)
 DATAFILE= "C:\Desktop\Test.xls"
 DBMS=EXCEL REPLACE;
 RANGE="&var";
 GETNAMES=YES;
RUN;
 %end;
%mend import;

%import ;

我希望这很清楚。

答案 1 :(得分:0)

我复制了问题,也无法从Excel导入动态(非固定)范围。它不适用于EXCELXLSX引擎。

如果您需要快速解决方案而不一定必须使用Excel范围,则可以采用以下方法解决此问题:

  1. 分配一个工作表的单元格,例如A1,用于存储您当前存储在动态范围TBL_sheet1中的内容,即要导入的单元格范围。
  2. squircle

    1. 仅执行proc import导入此范围的单元格:

      PROC IMPORT DATAFILE="C:\test.xlsx" DBMS=xlsx out=work.x
      replace;
      getnames=no;
      RANGE="Sheet1$A1:A1";
      RUN;
      
    2. 接下来,将导入的范围放入宏变量,并使用正确的proc import定义再次执行RANGE=

          %let range=;
          proc sql noprint;
              select A into :range
              from work.x;
          quit;
          %let range = %sysfunc(compress(&range.,$,));
          %put &range.;
          /* resolves to: B2:B4 */
      
          %macro import(x);
              PROC IMPORT DATAFILE="C:\test.xlsx" DBMS=xlsx out=work.y
                 replace;
                 getnames=no;
                 RANGE="Sheet1$&x.";
              RUN;
          %mend;
          %import(&range.);