gpt4 book ai didi

excel - SAS:使用 PROC IMPORT 导入 .xlsx 时定义类型

转载 作者:行者123 更新时间:2023-12-05 01:04:08 27 4
gpt4 key购买 nike

问题:使用 PROC IMPORT 时,如何定义从 .xlsx 文件导入的变量的变量类型?

我的作品

我正在使用 SAS v9.4。据我所知,它是 Vanilla SAS。我没有 SAS/ACCESS 等。

我的数据如下所示:

ID1        ID2  MONTH   YEAR    QTR VAR1    VAR2
ABC_1234 1 1 2010 1 869 3988
ABC_1235 12 2 2010 1 639 3144
ABC_1236 13 3 2010 2 698 3714
ABC_1237 45 4 2010 2 630 3213

我正在运行的程序是:
proc import out=rawdata
datafile = "c:\rawdata.xlsx"
dbms = xlsx replace;

format ID1 $9. ;
format ID2 $3. ;
format MONTH best2. ;
format YEAR best4. ;
format QTR best1. ;
format VAR1 best3. ;
format VAR2 best4. ;
run;

当我运行这一步时,我得到以下日志输出:

ERROR: You are trying to use the character format $ with the numeric variable ID2 in data set WORK.RAWDATA.



这似乎告诉我的是 SAS 自动分配变量类型。我希望能够手动控制它。我找不到解释如何执行此操作的文档。 INFORMAT、LENGTH 和 INPUT 语句似乎不适用于 PROC IMPORT。

我正在使用 PROC IMPORT,因为它在 .xlsx 文件中取得了最大的成功。我能想到的两种可能的解决方案是 1)将 .xlsx 转换为 .csv 并在 DATA 步骤中使用 INFILE 以及 2)将数据作为数字输入并在稍后的步骤中将其转换为字符。我不喜欢第一个解决方案,因为它需要我手动操作数据,这是潜在的错误来源(例如删除前导零)。我不喜欢第二个,因为它可能会无意中引入错误(再次,例如前导零)并引入无关的工作。

最佳答案

您可以尝试在 Excel 中将列类型设置为“文本”,以查看 SAS 是否会从中确定。值得一试。

如果这不起作用,除非您使用 PC 文件服务器,或者在同一 SAS 服务器上安装相同位数的 Excel 以直接访问文件,否则您将需要使用单独的数据步骤来转换列。

proc import 
file = "c:\rawdata.xlsx"
out=_rawdata(rename=(ID2 = _ID2) )
dbms = xlsx replace;
run;

data rawdata;
format ID1 $9. ;
format ID2 $3. ;
format MONTH best2. ;
format YEAR best4. ;
format QTR best1. ;
format VAR1 best3. ;
format VAR2 best4. ;

set _rawdata;

ID2 = cats(_ID2);

drop _:;
run;

如果您有 SAS/Access to Excel,您可以使用 DBDSOPTS data set option 直接控制这些变量。 .例如:
libname myxlsx Excel 'C:\rawdata.xlsx';

data rawdata;
set myxlsx.'Sheet1$'n(DBDSOPTS="DBTYPE=(ID2='CHAR(3)')");
run;

出现问题的原因是因为 xlsx引擎在 proc import是 SAS 内部的,独立于 Excel引擎。 Excel引擎使用 Microsoft Jet 或 Ace,而 xlsx引擎使用的专有系统没有微软的控制权。为什么会这样,我不知道。

proc import运行时,SAS 将尝试猜测它应该是什么格式(您可以使用 guessingrows 选项控制 xls 文件的格式)。如果它检测到所有数字,它将假定一个数字变量。不幸的是,如果没有安装 SAS/ACCESS to Excel 或 PC Files Server,您将无法直接控制变量类型。

关于excel - SAS:使用 PROC IMPORT 导入 .xlsx 时定义类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39003289/

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