带有dynamic命名范围的SAS PROC导入

我有一个包含数据库信息的工作簿,这些信息分成了多个要导入SAS进行进一步操作的选项卡。

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

因此,我已经在每个选项卡中设置了dynamic命名范围,这样它就TBL_SHEET1我需要的确切尺寸,即我的命名范围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; 

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

在下面的例子中,我selectRange A1:C7并将范围命名为Test

在这里输入图像说明

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

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

在上面的代码中, Range告诉SAS从名称范围Test下的excel中导入数据。 您也可以自动执行代码并将多个具有dynamic名称范围的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 ; 

我希望这是明确的。

我复制了这个问题,也不能从Excel导入一个dynamic的 (不固定的)范围。 它不适用于EXCELXLSX引擎。

如果你需要一个快速的解决scheme,并不一定要使用Excel范围,这里是解决这个问题的方法:

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

在这里输入图像说明

  1. 执行proc import只导入这个单元格范围:

     PROC IMPORT DATAFILE="C:\test.xlsx" DBMS=xlsx out=work.x replace; getnames=no; RANGE="Sheet1$A1:A1"; RUN; 
  2. 接下来,将导入的范围放到一个macrosvariables中,并用适当的RANGE= definition再次执行proc import

      %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.);