Import SAS 9.4 64位XLSX 32位导入:以文本形式读取日期和文本的列,以及未格式化的日期

Import SAS 9.4 64位XLSX 32位导入:以文本形式读取日期和文本的列,以及未格式化的日期,import,sas,import-from-excel,Import,Sas,Import From Excel,我正在使用64位SAS 9.4从32位Excel导入文件。我的许多Excel列同时包含日期和日期列表,如下所示: 九月日期科尔 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:\f

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

九月日期科尔
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的原始未格式化日期约定值导入的:

九月日期科尔
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不起作用。提前感谢您提供的任何建议。

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

sasdt = exceldt - ('01JAN1960'd - '01JAN1900'd +2) ;
但由于1960年1月1日的数据为零,你可以简化为

sasdt = exceldt + '01JAN1900'd - 2 ;
现在你只需要一点逻辑来区分数字和字符串。例如,您可以测试字符串是否转换为介于1('01JAN1900'd)和43100('31DEC2017'd)之间的数字,以及是否转换为MM/DD/YYYY格式的字符串

if 0 <= input(SeptemberDatesCol,??32.) <= 43100 then
  SeptemberDatesCol = put(input(SeptemberDatesCol,??32.),mmddyys10.) 
;
如果0 9/01和9/10和9/21
SeptemberDatesCol=9/23->9/23
SeptemberDatesCol=42643->2016年9月30日
SeptemberDatesCol=42643->2016年9月30日
SeptemberDatesCol=42641->2016年9月28日
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