首页 文章

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

提问于
浏览
3

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


My work

我使用的是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;

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

错误:您正在尝试在数据集WORK.RAWDATA中使用字符格式$和数字变量ID2 .

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

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

2 回答

  • 0

    您可以尝试在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;
    

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

    proc import 运行时,SAS将尝试猜测它应该是什么格式(使用 guessingrows 选项可以控制xls文件) . 如果它检测到所有数字,它将采用数字变量 . 遗憾的是,如果未安装SAS / ACCESS到Excel或PC文件服务器,则无法直接控制变量类型 .

  • 4

    在Excel中定义类型 .

    如果您想稍后转换它,请使用数据步骤转换列 .

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

相关问题