SAS导出到Excel,无法读回SAS

时间:2017-03-01 20:54:44

标签: excel sas

[注意:我在下面插入了一行,并添加了对我的具体情况的详细说明。我留下原来的描述,因为汤姆的回答是基于它的。]

在Win10Pro下使用SAS 9.4(32位)和Excel 2013(32位)。

在SAS中,我使用以下代码在现有工作簿中创建了一个新的Excel工作表

proc export data=sashelp.air file="C:\Users\user1\Desktop\test1.xlsx" 
     dbms=XLSX replace;
    sheet="AirlineData";
run;

我关闭了SAS,在Excel中打开了工作簿,看到了我的原始工作表以及包含预期数据的新AirlineData表(标题加上144个数据行)。到目前为止,非常好。

我关闭了Excel,打开了SAS,并执行了以下SAS语句:

options validmemname=extend;
libname desktop "C:\Users\user1\Desktop\test1.xlsx";

我打开SAS Explorer并导航到库“Desktop”并看到了三个工作表:

  • AirlineData
  • AirlineData $
  • Sheet 1中$

当我双击Sheet1 $时,我看到了原始数据,但当我双击其他任何一个名字时,我看到的只是空表,如下所示:

    F1 F2
  1
  2
  3

细胞是空的,但有144个观察结果。标题行被忽略。

我执行了PROC PRINT DATA=desktop.airlinedata并在结果查看器中看到了同样的事情:名为F1和F2的变量有144个空的观察值。

然而,当我清除libref并运行以下内容时,我得到了一个包含预期数据的SAS数据集(两个变量,144个观察值):

proc import datafile="C:\Users\user1\Desktop\test1.xlsx" dbms=xlsx OUT=testit
     replace;
    sheet="AirlineData";
run;

因此,当我使用PROC EXPORT创建工作表时,我无法通过libref使用工作表。

我做错了吗?

[新说明]

摘要:问题是在现有工作簿中创建新工作表时EXCEL和XLSX引擎的工作方式。两个引擎是否应该可以互换可能有争议,但在我看来,如果SAS正确地创建一个新工作表,它应该能够用任何引擎读取它。

实际上,如果您使用XLSX引擎使用PROC EXPORT创建新工作表,但使用LIBNAME <libref> [EXCEL] <path\file.xlsx>通过EXCEL引擎读取它,那么“PROC PRINT”或“DATA”等方法'步骤将无法正确读取。但是,如果使用EXCEL引擎使用PROC EXPORT创建它,则SAS可以使用带有XLSX EXCEL引擎的LIBNAME语句来读取它。

第1步:

Workbook test.xlsx是在Excel 2013中创建的,包含三行四位数字。

proc export data=sashelp.air file="C:\Users\user1\Desktop\test.xlsx" 
     dbms=XLSX replace;
    sheet="AirlineData";
run;

关闭SAS。 Excel以正常方式显示AirlineData工作表。关闭Excel。

重新打开SAS,执行:

1    PROc import datafile="C:\Users\user1\Desktop\test.xlsx" dbms=xlsx OUT=xx replace;
2        sheet="AirlineData";
3    run;
NOTE: WORK.XX data set was successfully created.
NOTE: The data set WORK.XX has 144 observations and 2 variables.

数据集XX似乎是具有正确航空公司数据的普通SAS数据集。

现在执行:

6    options validmemname=extend;
7    libname xldata XLSX "C:\Users\user1\Desktop\test.xlsx";
NOTE: Libref XLDATA was successfully assigned as follows:
      Engine:        XLSX
      Physical Name: C:\Users\user1\Desktop\test.xlsx

库xldata下的SAS Explorer显示“SHEET1”和“AIRLINEDATA”,但SAS查看器不会打开任何一个(前面描述的问题,并且报告给SAS支持)。

但是,PROC PRINTDATA步骤会按预期打印并复制两个工作表中的数据。

现在执行:

8    options validmemname=extend;
9    libname xldata "C:\Users\user1\Desktop\test.xlsx";
NOTE: Libref XLDATA was successfully assigned as follows:
      Engine:        EXCEL
      Physical Name: C:\Users\user1\Desktop\test.xlsx

注意EXCEL是引擎。

库xldata下的SAS Explorer显示“Sheet1 $”。 “AirlineData”和“AirlineData $”。

  • SAS查看器打开Sheet1 $没有任何问题。
  • SAS查看器称AirlineData $有0个观测值。它显示单个变量(F1),没有任何观察结果。
  • SAS查看器显示变量F1和F2,其中AirlineData有144个明显空的观察结果。

PROC PRINT在AirlineData $中也没有发现任何观察结果,并从AirlineData打印出144个空的观察结果。

DATA步也在AirlineData $中找不到任何观察结果,并从AirlineData复制144个空观察值。

第2步:

Excel工作簿test2.xlsx是原始test.xlsx的副本(通过在Windows中复制而创建)。

28   LIBNAME xldata clear; * Just in case;
NOTE: Libref XLDATA has been deassigned.

29   proc export data=sashelp.air file="C:\Users\user1\Desktop\test2.xlsx"
30        dbms=EXCEL replace;
31       sheet="AirlineData";
32   run;
NOTE: "AirlineData" range/sheet was successfully created.

关闭SAS。 Excel以正常方式显示AirlineData工作表。关闭Excel。

重新打开SAS,执行:

1    PROc import datafile="C:\Users\user1\Desktop\test2.xlsx" dbms=EXCEL OUT=xx replace;
2        sheet="AirlineData";
3    run;
NOTE: WORK.XX data set was successfully created.
NOTE: The data set WORK.XX has 144 observations and 2 variables.

数据集XX似乎是具有正确航空公司数据的普通SAS数据集。

现在执行:

4    options validmemname=extend;
5    libname xldata xlsx "C:\Users\user1\Desktop\test2.xlsx";
NOTE: Libref XLDATA was successfully assigned as follows:
      Engine:        XLSX
      Physical Name: C:\Users\user1\Desktop\test2.xlsx

库xldata下的SAS Explorer显示“SHEET1”和“AIRLINEDATA”,但SAS查看器不会打开任何一个(与上面相同的问题)。

如上所述,PROC PRINTDATA步骤按预期打印并复制两个工作表中的数据。

现在执行:

12   options validmemname=extend;
13   libname xldata "C:\Users\user1\Desktop\test2.xlsx";
NOTE: Libref XLDATA was successfully assigned as follows:
      Engine:        EXCEL
      Physical Name: C:\Users\user1\Desktop\test2.xlsx

注意EXCEL是引擎。

库xldata下的SAS Explorer显示“Sheet1 $”。 “AirlineData”和“AirlineData $”。 SAS查看器打开所有三张纸,没有任何问题。

此外,PROC PRINTDATA步骤会按预期打印并复制所有三个工作表中的数据。

2 个答案:

答案 0 :(得分:2)

确保在libname语句中使用XLSX引擎。

此代码适用于我,但它是从头开始创建XLSX文件,而不是使用已由其他软件创建的文件。

制作XLSX文件并关闭它。

libname out xlsx '~/test/test1.xlsx';
data out.class ; set sashelp.class; run;
libname out ;

再次打开它并添加一个新表。

libname out xlsx '~/test/test1.xlsx';
data out.air; set sashelp.air; run;
libname out;

再次打开它并读出数据。

libname in xlsx '~/test/test1.xlsx';
proc copy inlib=in outlib=work;
run;
libname in ;

答案 1 :(得分:0)

我向SAS支持报告了这些问题。

他们确认第一个问题(OP中的行之上)与使用XLSX引擎查看 Excel工作表严格相关。他们承认XLSX引擎目前功能有限。

对于第二个问题(在OP下面的行下面),支持认为它代表了一个错误。他们说他们会联系研发部门。