问题:使用 PROC IMPORT 时如何定义从 .xlsx 文件导入的变量的变量类型?
My work
我正在使用 SAS v9.4。据我所知,它是普通的 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;
当我运行此步骤时,我得到以下日志输出:
错误:您正在尝试将字符格式 $ 与数据集 WORK.RAWDATA 中的数值变量 ID2 一起使用。
这似乎告诉我 SAS 自动分配变量类型。我希望能够手动控制它。我找不到解释如何执行此操作的文档。 INFORMAT、LENGTH 和 INPUT 语句似乎不适用于 PROC IMPORT。
我使用 PROC IMPORT 是因为它在 .xlsx 文件总体上取得了最大的成功。我能想到的两种可能的解决方案是1)将.xlsx转换为.csv并在数据步骤中使用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 数据集选项 http://support.sas.com/documentation/cdl/en/acpcref/63184/HTML/default/viewer.htm#a003103761.htm。例如:
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
引擎使用专有系统,该系统没有微软那么多的控制权。为什么会这样,我不知道。
When proc import
运行时,SAS 将尝试猜测它应该是什么格式(您可以使用 xls 文件来控制该格式)guessingrows
选项)。如果它检测到所有数字,它将假定为数字变量。不幸的是,如果没有安装 SAS/ACCESS to Excel 或 PC 文件服务器,您无法直接控制变量类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)