Lor*_*sum 3 import excel types sas
问题:使用PROC IMPORT时,如何定义从.xlsx文件导入的变量的变量类型?
我的工作
我正在使用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
Run Code Online (Sandbox Code Playgroud)
我正在运行的过程是:
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;
Run Code Online (Sandbox Code Playgroud)
运行此步骤时,将获得以下日志输出:
错误:您试图在数据集WORK.RAWDATA中使用字符格式$和数字变量ID2。
这似乎告诉我,SAS会自动分配变量类型。我希望能够手动控制它。我找不到说明如何执行此操作的文档。INFORMAT,LENGTH和INPUT语句似乎不适用于PROC IMPORT。
我使用PROC IMPORT是因为它在.xlsx文件总体上取得了最大的成功。我可以想到的两个可能的解决方案是:1)将.xlsx转换为.csv并在DATA步骤中使用INFILE; 2)将数据作为数字输入,并在后续步骤中将其转换为字符。我不喜欢第一个解决方案,因为它需要我手动处理数据,这是潜在的错误源(例如删除了前导零)。我不喜欢第二个,因为它可能会无意间引入错误(同样,例如前导零),并引入多余的工作。
您可以尝试在Excel中将列类型设置为“文本”,以查看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;
Run Code Online (Sandbox Code Playgroud)
如果您确实拥有SAS /对Excel的访问权限,则可以使用DBDSOPTS数据集选项直接控制这些变量。例如:
libname myxlsx Excel 'C:\rawdata.xlsx';
data rawdata;
set myxlsx.'Sheet1$'n(DBDSOPTS="DBTYPE=(ID2='CHAR(3)')");
run;
Run Code Online (Sandbox Code Playgroud)
发生此问题的原因是,xlsx引擎位于proc importSAS内部,并且与Excel引擎分离。该Excel引擎使用Microsoft Jet或Ace,而该xlsx引擎使用专有系统,该系统的控制力不及Microsoft。为什么会这样,我不知道。
当proc import运行时,SAS将尝试猜测它应该是什么格式(你有控制权与使用XLS文件guessingrows选项)。如果检测到所有数字,它将采用数字变量。不幸的是,如果没有安装SAS / ACCESS to Excel或PC Files Server,就无法直接控制变量类型。