gpt4 book ai didi

excel - SAS导出到Excel,无法读回SAS

转载 作者:行者123 更新时间:2023-12-02 23:23:28 24 4
gpt4 key购买 nike

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

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


航空公司数据
航空公司数据$
图纸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可以使用 LIBNAME语句通过XLSX或EXCEL引擎读取它。

第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资源管理器显示“ 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资源管理器显示“ Sheet1 $”。 “ AirlineData”和“ AirlineData $”。


SAS查看器可以毫无问题地打开Sheet1 $。
SAS查看器显示AirlineData $有0个观测值。它显示一个没有观察值的变量(F1)。
SAS查看器显示变量F1和F2,其中有144个AirlineData明显为空的观测值。


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资源管理器显示“ 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资源管理器显示“ Sheet1 $”。 “ AirlineData”和“ AirlineData $”。 SAS查看器可以毫无问题地打开所有三张纸。

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

最佳答案

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

关于excel - SAS导出到Excel,无法读回SAS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42541861/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com