【问题标题】:SAS PROC IMPORT with Dynamic Named Ranges具有动态命名范围的 SAS PROC IMPORT
【发布时间】:2017-05-12 10:01:39
【问题描述】:

我有一个包含数据库信息的工作簿,该工作簿分为多个选项卡,我想将这些信息导入 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;

【问题讨论】:

  • 请提供您的proc import代码和失败信息的内容。
  • 几年前我研究过这个并发现了同样的事情,即 SAS 只识别简单的命名范围,而不是动态范围。这不太可能是 SAS 的故障,而更多的是使两个软件能够相互通信的引擎。我想我最终创建了一个比我需要的更大的固定命名范围,仅用于导入 SAS
  • 你用的是什么引擎?您是否使用像 EXCEL 这样​​调用 microsoft 代码的软件?还是可以在非 Windows 操作系统上运行的新 XLSX 引擎?
  • @Tom 在 SAS 9.3、Excel 2013 上运行。

标签: excel sas named-ranges


【解决方案1】:

添加您的代码会很有帮助。但是,如果我正确理解了您的问题,则问题在于导入命名范围。这是一个关于如何将用户定义的命名范围导入 SAS 的示例。

在下面的示例中,我选择 Range 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 中导入数据。您还可以自动化代码并将具有动态名称范围的多个 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 ;

我希望这很清楚。

【讨论】:

  • 问题是我不相信 SAS 识别 Excel 中的动态命名范围,只能识别固定范围。尝试按照 OP 详细说明的方式将您的命名范围更改为动态范围,您会发现它不会出现在 SAS 中
  • 是的,@Longfish 我的问题完全正确。无论如何,感谢您的回复 Praneeth Kumar
  • 没问题。非常感谢@Longfish 的澄清
【解决方案2】:

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

如果您需要快速解决方案并且不一定必须使用 Excel 范围,这里有一个解决该问题的方法:

  1. 分配一个工作表的单元格,例如A1 用于存储您当前存储在动态范围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. 接下来,将导入的范围放到一个宏变量中,并使用正确的RANGE= 定义再次执行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.);
    

【讨论】:

  • 这可能是许多潜在的解决方法之一,尽管我希望我能坚持更直接的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多