Использование SAS для чтения даты по юлианскому календарю, разделенной точкой

Я использую SAS 9.2, пытаясь прочитать данные из служебного отчета IDCAMS, в котором содержится информация о наборах данных мэйнфрейма z / OS. Даты имеют формат yyyy.jjj, где yyyy - это четырехзначный год, а jjj - юлианский день года. Проблема с периодом, поскольку стандартным SAS INFORMATS он не нравится. Как бы я прочитал такую ​​дату?

Образец кода:

DATA ALL smflist (KEEP=DSNAME volser) ;         
LENGTH dsname $ 44. volser $ 6. createdt 8.;   
INFILE SYSPRINT LENGTH=LEN;                     
input @ "NONVSAM ------- " dsname;             
input @ "CREATION--------" createdt JULIAN8.;   
input @ "VOLSER------------" volser;           

Пример вывода, включая INFILE SYSPRINT: (в столбце 54 указана дата создания)

NOTE: Invalid data for createdt in line 282 54-61.                               
NONVSAM ------- SYSP.LPAR.SMFOTHR.ROLLING.G3563V00                               
     IN-CAT --- USR.UCAT.ALIASP                                                 
     HISTORY                                                                     
       DATASET-OWNER-----(NULL)     CREATION--------2014.174                     
       RELEASE----------------2     EXPIRATION------0000.000                     
       ACCOUNT-INFO-----------------------------------(NULL)                     
       STATUS------------ACTIVE                                                 
     SMSDATA                                                                     
       STORAGECLASS ------SCPNV     MANAGEMENTCLASS-MCPNVGD2                     
       DATACLASS ---------DCSMF     LBACKUP ---XXXX.XXX.XXXX                     
     VOLUMES                                                                     
       VOLSER------------MIGRAT     DEVTYPE------X'78048081'     FSEQN---------- 
     ASSOCIATIONS                                                               
       GDG------SYSP.LPAR.SMFOTHR.ROLLING                                       
     ATTRIBUTES                                                                 

person Richard_G    schedule 04.08.2014    source источник
comment
Я предлагаю манипулировать строкой, чтобы заставить ее работать. Вы можете использовать _INFILE_ автоматическую переменную после того, как прочитаете первую строку, и, возможно, измените ее таким образом.   -  person Joe    schedule 05.08.2014
comment
Я пробовал использовать _INFILE_ и считаю, что это должно сработать. Но, несмотря на то, что я его изменил, более поздние попытки ввода из него вернули неизмененную недопустимую дату. Тем не менее, спасибо за вашу помощь. Это как бы повернуло меня в правильном направлении.   -  person Richard_G    schedule 05.08.2014


Ответы (1)


Этот код обработал это ...

  DATA smflist (KEEP=dsname createdt volser) ;               
  LENGTH dsname $ 44. volser $ 6. dummy $ 8. createdt 7.;   
  FORMAT CREATEDT MMDDYY10.;                                 
  INFILE SYSPRINT LENGTH=LEN;                               
  input @ "NONVSAM ------- " dsname;                         
  input @ "CREATION--------" dummy;                         
  dummy = prxchange('s/(\d{4}).(\d{3})/\1\2/', -1, dummy);   
  createdt = input(dummy,JULIAN7.);                         
  input @ "VOLSER------------" volser;                       
person Richard_G    schedule 05.08.2014