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

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)将数据作为数字输入,并在后续步骤中将其转换为字符。我不喜欢第一个解决方案,因为它需要我手动处理数据,这是潜在的错误源(例如删除了前导零)。我不喜欢第二个,因为它可能会无意间引入错误(同样,例如前导零),并引入多余的工作。

Stu*_*ski 5

您可以尝试在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,就无法直接控制变量类型。