【问题标题】:SAS 9.4 64-bit XLSX 32-bit import: Columns with date and text read in as text, with unformatted datesSAS 9.4 64 位 XLSX 32 位导入:具有日期和文本的列作为文本读入,日期未格式化
【发布时间】:2017-07-18 21:56:25
【问题描述】:

我正在使用 64 位 SAS 9.4 从 32 位 Excel 导入文件。我的许多 Excel 列都包含日期和日期列表,如下所示:

SeptemberDatesCol
9/13 和 9/27
9/13 和 9/26
9/01 & 9/10 & 9/21
9/23
9/30
9/30
9/28

我不是该文件的所有者,它会定期更新,因此所有主要的操作和格式化都需要在 SAS 中进行。导入后,我可以将其更改为每行一个日期的正常列表,但导入本身并未正确导入日期。我的导入代码:

PROC IMPORT OUT=Raw_Import  DATAFILE= "J:\filename.xlsx"  DBMS=XLSX REPLACE;  
SHEET="Sheetname";  
GETNAMES=YES;     
RUN;

SeptemberDatesCol 作为字符变量导入(根据需要),除了 一些 具有单个日期的行,日期使用 Excel 的原始未格式化日期约定值导入:

SeptemberDatesCol
9/13 和 9/27
9/13 和 9/26
9/01 & 9/10 & 9/21
9/23
42643
42643
42641

我可以做些什么不同的事情来让列正确导入?当我使用 DBMS=EXCELCS 时,出现“连接服务器失败”错误。鉴于我工作的软件设置(64 位 SAS 9.4 和 32 位 Excel),DBMS=EXCEL 不起作用。提前感谢您提供的任何建议。

【问题讨论】:

    标签: import sas import-from-excel


    【解决方案1】:

    当您在 XLSX 文件中导入包含混合文本和数字的列时,SAS 将以原始格式导入数字。您可以使用简单的算术将看起来像原始日期的字符串从 Excel 的基准日期转换为 SAS 的基准日期。因此,如果您减去两个系统使用的基准日期之间的天数差,还减去 1,因为 SAS 从 0 开始计数,Excel 从 1 开始计数,并且还减去 1,因为 Excel 认为 1900 年是闰年。

    sasdt = exceldt - ('01JAN1960'd - '01JAN1900'd +2) ;
    

    但由于 '01JAN1960'd 只是零,您可以简化为

    sasdt = exceldt + '01JAN1900'd - 2 ;
    

    现在你只需要一点逻辑来区分数字和字符串。例如,您可以测试字符串是否转换为 1('01JAN1900'd)和 43,100('31DEC2017'd)之间的数字,以及它是否将其转换为 MM/DD/YYYY 格式的字符串。

    if 0 <= input(SeptemberDatesCol,??32.) <= 43100 then
      SeptemberDatesCol = put(input(SeptemberDatesCol,??32.),mmddyys10.) 
    ;
    

    因此您的示例数据将被转换为:

    52   data have ;
    53     input SeptemberDatesCol $30. ;
    54     put SeptemberDatesCol= @ ;
    55     if 0 <= input(SeptemberDatesCol,??32.) <= 43100 then
    56         SeptemberDatesCol = put(input(SeptemberDatesCol,??32.)+'01JAN1900'd-2,mmddyys10.)
    57     ;
    58     put '-> ' SeptemberDatesCol ;
    59
    60   cards;
    
    SeptemberDatesCol=9/13 & 9/27 -> 9/13 & 9/27
    SeptemberDatesCol=9/13 & 9/26 -> 9/13 & 9/26
    SeptemberDatesCol=9/01 & 9/10 & 9/21 -> 9/01 & 9/10 & 9/21
    SeptemberDatesCol=9/23 -> 9/23
    SeptemberDatesCol=42643 -> 09/30/2016
    SeptemberDatesCol=42643 -> 09/30/2016
    SeptemberDatesCol=42641 -> 09/28/2016
    

    【讨论】:

      猜你喜欢
      • 2018-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-01
      相关资源
      最近更新 更多