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