Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# haven (development version)

* `read_sas()` and `read_xpt()` now supports all datetime, date and time
formats (#780) and correctly recognises DATEAMPM as datetime (#789).

* Fix bug that caused `write_xpt()` to fail when writing tagged `NA` values (#755).

* Tagged `NA` values are now silently converted to lower case when they are
Expand Down
51 changes: 44 additions & 7 deletions src/haven_types.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,22 +53,59 @@ VarType numType(FileVendor vendor, const char* var_format) {
case HAVEN_SAS:
// http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000589916.htm
if (hasPrefix(format,"DATETIME")) return HAVEN_DATETIME;
else if (hasPrefix(format,"DT")) return HAVEN_DATETIME;
else if (hasPrefix(format,"DATEAMPM")) return HAVEN_DATETIME;
else if (hasPrefix(format,"MDYAMPM")) return HAVEN_DATETIME;
else if (hasPrefix(format,"NLDATMT")) return HAVEN_DATETIME;
else if (hasPrefix(format,"NLDATM")) return HAVEN_DATETIME;
else if (hasPrefix(format,"IS8601DN")) return HAVEN_DATETIME;
else if (hasPrefix(format,"IS8601DT")) return HAVEN_DATETIME;
else if (hasPrefix(format,"E8601DT")) return HAVEN_DATETIME;
else if (hasPrefix(format,"IS8601DZ")) return HAVEN_DATETIME;
else if (hasPrefix(format,"B8601DN")) return HAVEN_DATETIME;
else if (hasPrefix(format,"B8601DT")) return HAVEN_DATETIME;
else if (hasPrefix(format,"B8601DX")) return HAVEN_DATETIME;
else if (hasPrefix(format,"B8601DZ")) return HAVEN_DATETIME;
else if (hasPrefix(format,"B8601LX")) return HAVEN_DATETIME;
else if (hasPrefix(format,"E8601DN")) return HAVEN_DATETIME;
else if (hasPrefix(format,"E8601DT")) return HAVEN_DATETIME;
else if (hasPrefix(format,"E8601DX")) return HAVEN_DATETIME;
else if (hasPrefix(format,"E8601DZ")) return HAVEN_DATETIME;
else if (hasPrefix(format,"E8601LX")) return HAVEN_DATETIME;
else if (hasPrefix(format,"DATE")) return HAVEN_DATE;
else if (hasPrefix(format,"NLDATE")) return HAVEN_DATE;
else if (hasPrefix(format,"DOWNAME")) return HAVEN_DATE;
else if (hasPrefix(format,"IS8601DA")) return HAVEN_DATE;
else if (hasPrefix(format,"E8601DA")) return HAVEN_DATE;
else if (hasPrefix(format,"B8601DA")) return HAVEN_DATE;
else if (hasPrefix(format,"WEEKDATE")) return HAVEN_DATE;
else if (hasPrefix(format,"E8601DA")) return HAVEN_DATE;
else if (hasPrefix(format,"DAY")) return HAVEN_DATE;
else if (hasPrefix(format,"WEEK")) return HAVEN_DATE;
else if (hasPrefix(format,"MON")) return HAVEN_DATE;
else if (hasPrefix(format,"QTR")) return HAVEN_DATE;
else if (hasPrefix(format,"YEAR")) return HAVEN_DATE;
else if (hasPrefix(format,"MMDDYY")) return HAVEN_DATE;
else if (hasPrefix(format,"DDMMYY")) return HAVEN_DATE;
else if (hasPrefix(format,"YYMMDD")) return HAVEN_DATE;
else if (hasPrefix(format,"DATE")) return HAVEN_DATE;
else if (hasPrefix(format,"MMYY")) return HAVEN_DATE;
else if (hasPrefix(format,"YYMM")) return HAVEN_DATE;
else if (hasPrefix(format,"YY")) return HAVEN_DATE;
else if (hasPrefix(format,"WORDDAT")) return HAVEN_DATE;
else if (hasPrefix(format,"NENGO")) return HAVEN_DATE;
else if (hasPrefix(format,"JULIAN")) return HAVEN_DATE;
else if (hasPrefix(format,"JULDAY")) return HAVEN_DATE;
else if (hasPrefix(format,"PDJULG")) return HAVEN_DATE;
else if (hasPrefix(format,"PDJULI")) return HAVEN_DATE;
else if (hasPrefix(format,"TIME")) return HAVEN_TIME;
else if (hasPrefix(format,"TIMEAMPM")) return HAVEN_TIME;
else if (hasPrefix(format,"NLTIM")) return HAVEN_TIME;
else if (hasPrefix(format,"TOD")) return HAVEN_TIME;
else if (hasPrefix(format,"HOUR")) return HAVEN_TIME;
else if (hasPrefix(format,"HHMM")) return HAVEN_TIME;
else if (hasPrefix(format,"IS8601TM")) return HAVEN_TIME;
else if (hasPrefix(format,"E8601TM")) return HAVEN_TIME;
else if (hasPrefix(format,"B8601TM")) return HAVEN_TIME;
else if (hasPrefix(format,"MMSS")) return HAVEN_TIME;
else if (hasPrefix(format,"IS8601T")) return HAVEN_TIME;
else if (hasPrefix(format,"B8601T")) return HAVEN_TIME;
else if (hasPrefix(format,"B8601LZ")) return HAVEN_TIME;
else if (hasPrefix(format,"E8601T")) return HAVEN_TIME;
else if (hasPrefix(format,"E8601LZ")) return HAVEN_TIME;
else return HAVEN_DEFAULT;
case HAVEN_SPSS:
// http://www-01.ibm.com/support/knowledgecenter/?lang=en#!/SSLVMB_20.0.0/com.ibm.spss.statistics.help/syn_date_and_time_date_time_formats.htm
Expand Down
Loading