【问题标题】:SAS export to Excel, unable to read back into SASSAS 导出到 Excel,无法读回 SAS
【发布时间】:2017-07-21 09:04:59
【问题描述】:

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

在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”并看到三个工作表:

  • 航空公司数据
  • 航空公司数据$
  • Sheet1$

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

    F1 F2
  1
  2
  3

单元格是空的,但有 144 个观察值。标题行被忽略了。

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

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

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 步:

工作簿 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$”。 “航空公司数据”和“航空公司数据 $”。

  • 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$”。 “航空公司数据”和“航空公司数据 $”。 SAS 查看器可以毫无问题地打开所有三个工作表。

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

【问题讨论】:

  • 正如 Tom 所指出的,在 libname 语句中明确指定 XLSX。否则 SAS 会做出假设(最有可能是 Excel 或 XLS),并且您知道他们对假设的看法 :)。
  • @Reeza - 查看我对 Tom 的回答的评论,以及我链接的 SAS 社区中的讨论。我不认为这很简单——事实上,指定 XLSX 引擎导致在 VIEW 窗口中查看 Excel 工作表时出现问题。
  • @Reeza - 我现在看到,当我使用没有引擎的 LIBNAME 时,SAS 默认使用 EXCEL 引擎。 EXCEL 引擎用于查看未修改的 Excel 2013 工作簿。但 XLSX 引擎没有。
  • 我建议使用 SAS 打开支持票证。然后,您可以将有问题的 XLSX 文件发送给他们,他们可以让您知道 SAS 是否可以处理。

标签: excel sas


【解决方案1】:

确保在您的 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 ;

【讨论】:

  • 我会继续处理这个问题,但我遇到了一个问题:使用LIBNAME <libref> XLSX ... 语句访问 Excel 工作簿我从未在 SAS 中打开过 ,所以它是在 Excel 中创建的,当我导航到工作表并尝试查看 Sheet1 时,我遇到了几个错误,包括存在多个具有此名称的 SAS 文件,并且在此查看器中不允许访问顺序表。如果我从LIBNAME 语句中删除“XLSX”,我会看到Sheet1$ 而不是Sheet1,它会在查看器中打开而没有错误。
  • 我在 SAS 社区中发现了这个线程,它基本上描述了我遇到的问题,即使有一个“解决方案”,我也没有看到解决方案如何解决 OP。它当然不能解决我的问题:communities.sas.com/t5/SAS-Procedures/…
  • 我发现它不能正确查看,但如果您使用正确的工作表名称导入它就可以了。这是一个奇怪的问题,但只要您熟悉 Excel 文件就可以了。如果您需要解决方法方面的帮助,您必须发布 excel 文件,以便有人可以复制您的问题。
  • @Reeza - 在 Tom 的建议下,我开了几张支持 SAS 的票。您是正确的,最初的问题严格在于查看,所以我报告了这一点。我将通过编辑我的 OP 来描述一个更微妙(也许值得商榷)的问题,我也报告了这个问题。谢谢!
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    相关资源
    最近更新 更多