Date time format in delimited text files

Hello:

Working with a data file from a mil-std-1553 databus monitor application, Alta View.  The files are saved as binary files, .cdp extension, but can also be exported to .csv files.  Sample of some data from a .csv file is below. 

My main challenge time and date formatting.  The timestamp is formatted using the year in brackets, julian date in parentheses, followed by system time. 

The files can be set to output the data words in hex or decimal, but date/time format doesn't seem to have any other options.

Going back to my request from a few years ago;

https://www.wavemetrics.com/forum/general/help-formatting-datetime-stri…

I'm not sure how much things have changed since Igor 6.  The date-time format from those files was a lot different as well.

The format is [year](julian day)hh:mm:ss.ss.???  Not sure what the "extra" decimals are on the ends of the time

 

Example data:

TimeStamp                                        TimeHigh           TimeLow(20nsLSB)     IMGap(100nsLSB)     CMD1      DATA01
[2020](236)19:35:11.981.685.000     0x0073BBFE     0xDB6BBEDA              0x00000107               0xDCA0   0xF7E3

Some sequential timestamp data:

[2020](236)19:35:11.981.685.000
[2020](236)19:35:12.081.805.200
[2020](236)19:35:12.181.805.400
[2020](236)19:35:12.281.813.480
[2020](236)19:35:12.381.689.680
[2020](236)19:35:12.481.675.360

"[2020](236)19:35:11.981.685.000" is a messy format.

If the file is tab-delimited, then Igor will load "[2020](236)19:35:11.981.685.000" as a text wave and load the remaining columns (0x0073BBFE, 0xDB6BBEDA, 0x00000107, 0xDCA0, 0xF7E3) as numeric. You will then have to parse the text wave using sscanf or Grep.

Here is a function that parses the date/time using sscanf:

// timeStamp is, e.g., "[2020](236)19:35:11.981.685.000 0x0073BBFE  0xDB6BBEDA  0x00000107  0xDCA0  0xF7E3"
// Function result is Igor date/time value
// Example: Print ParseTimeStamp("[2020](236)19:35:11.981.685.000   0x0073BBFE  0xDB6BBEDA  0x00000107  0xDCA0  0xF7E3")
Function ParseTimeStamp(String timestamp)
    int year, dayOfYear, hour, minute, second, fracSecond
    String formatStr = "[%d](%d)%d:%d:%d.%d"
    sscanf timestamp, formatStr, year, dayOfYear, hour, minute, second, fracSecond
    // Print year, dayOfYear, hour, minute, second, fracSecond  // For debugging only
   
    double dt = Date2Secs(year, 1, 1)
    dt += dayOfYear*24*3600
    dt += 3600*hour + 60*minute + second + fracSecond/1000
   
    // Print Secs2Date(dt,-2) + "T" + Secs2Time(dt,3,3) // For debugging only
   
    return dt
End

 

 

you can use sscanf to extract the numbers from the date string:

function getDateTime(s)
    string s
    variable year, day, hours, minutes, seconds
    sscanf s, "[%d](%d)%d:%d:%g", year, day, hours, minutes, seconds
    variable oneminute = 60
    variable onehour = 60 * oneminute
    variable oneday = 24 * onehour
    return date2secs(year, 1, 1) + day*oneday + hours*onehour + minutes*oneminute + seconds
end