Search code examples
datesasjulian-date

Using SAS to read Julian date separated by a period


I am using SAS 9.2 attempting to read the data from an IDCAMS utility report that lists information about z/OS mainframe datasets. The dates are in the format yyyy.jjj where yyyy is the four digit year and jjj is the Julian day of the year. The period is the problem, as standard SAS INFORMATS don't like it. How would I read such a date?

Sample code:

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;           

Sample output including INFILE SYSPRINT: (Col 54 has the creation date)

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                                                                 

Solution

  • This code handled it...

      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;