SAS:使用PROC IMPORT导入.xlsx时定义types

问题:如何在使用PROC IMPORT时定义从.xlsx文件导入的variablestypes?


我的工作

我正在使用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中使用字符格式$与数字variablesID2。

这似乎告诉我,SAS自动分配variablestypes。 我想能够手动控制它。 我无法find说明如何做到这一点的文档。 INFORMAT,LENGTH和INPUT语句似乎不适用于PROC IMPORT。

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

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

如果这样做不起作用,除非使用PC Files Server,或者在相同的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数据集选项直接控制这些variables。 例如:

 libname myxlsx Excel 'C:\rawdata.xlsx'; data rawdata; set myxlsx.'Sheet1$'n(DBDSOPTS="DBTYPE=(ID2='CHAR(3)')"); run; 

问题出现的原因是因为proc importxlsx引擎是SAS内部的,并且与Excel引擎是分开的。 Excel引擎使用Microsoft Jet或Ace,而xlsx引擎使用的专有系统没有微软那么多的控制权。 为什么是这样,我不知道。

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

在Excel中定义types。

如果您想稍后再进行转换,请使用数据步骤转换该列。

 data want ; length id1 $9 id2 $3 ; set rawdata(rename=(id2=numeric_id2)); id2=cats(numeric_id2); drop numeric_id2; run;