private TimeSeriesPoint ConvertRowToPoint(DataRow row) { Instant? time = null; double? value = null; int? gradeCode = null; List <string> qualifiers = null; DateTimeZone zone = null; ParseNullableColumn <string>(row, Context.CsvTimezoneField?.ColumnIndex, text => { if (Context.TimezoneAliases.TryGetValue(text, out var alias)) { text = alias; } TimezoneHelper.TryParseDateTimeZone(text, out zone); }); if (Context.CsvDateOnlyField != null) { var dateOnly = DateTime.MinValue; var timeOnly = DefaultTimeOfDay; ParseColumn <DateTime>(row, Context.CsvDateOnlyField.ColumnIndex, dateTime => dateOnly = dateTime.Date); if (Context.CsvTimeOnlyField != null) { ParseColumn <DateTime>(row, Context.CsvDateOnlyField.ColumnIndex, dateTime => timeOnly = dateTime.TimeOfDay); } time = InstantFromDateTime(dateOnly.Add(timeOnly), () => zone); } else { ParseColumn <DateTime>(row, Context.CsvDateTimeField.ColumnIndex, dateTime => time = InstantFromDateTime(dateTime)); } ParseColumn <double>(row, Context.CsvValueField.ColumnIndex, number => value = number); ParseColumn <int>(row, Context.CsvGradeField?.ColumnIndex, grade => gradeCode = grade); ParseNullableColumn <string>(row, Context.CsvQualifiersField?.ColumnIndex, text => qualifiers = QualifiersParser.Parse(text)); if (time == null) { return(null); } ParseNullableColumn <string>(row, Context.CsvNotesField?.ColumnIndex, text => { if (time.HasValue) { AddRowNote(time.Value, text); } }); return(new TimeSeriesPoint { Time = time, Value = value, GradeCode = gradeCode, Qualifiers = qualifiers }); }
private TimeSeriesPoint ParseExcelRow(DataRow row) { Instant? time = null; double? value = null; int? gradeCode = null; List <string> qualifiers = null; DateTimeZone zone = null; if (!string.IsNullOrEmpty(Context.CsvComment) && ((row[0] as string)?.StartsWith(Context.CsvComment) ?? false)) { return(null); } try { ParseExcelStringColumn(row, Context.CsvTimezoneField?.ColumnIndex, text => { if (Context.TimezoneAliases.TryGetValue(text, out var alias)) { text = alias; } TimezoneHelper.TryParseDateTimeZone(text, out zone); }); if (Context.CsvDateOnlyField != null) { var dateOnly = DateTime.MinValue; var timeOnly = DefaultTimeOfDay; ParseExcelColumn <DateTime>(row, Context.CsvDateOnlyField.ColumnIndex, dateTime => dateOnly = dateTime.Date); if (Context.CsvTimeOnlyField != null) { ParseExcelColumn <DateTime>(row, Context.CsvTimeOnlyField.ColumnIndex, dateTime => timeOnly = dateTime.TimeOfDay); } time = InstantFromDateTime(dateOnly.Add(timeOnly), () => zone); } else { ParseExcelColumn <DateTime>(row, Context.CsvDateTimeField.ColumnIndex, dateTime => time = InstantFromDateTime(dateTime, () => zone)); } if (string.IsNullOrEmpty(Context.CsvNanValue)) { ParseExcelColumn <double>(row, Context.CsvValueField.ColumnIndex, number => value = number); } else { // Detecting the NaN value is a bit more tricky. // The column might have been converted as a pure string like "NA" or it could be a double like -9999.0 ParseValidExcelColumn(row, Context.CsvValueField.ColumnIndex, item => { if (!(item is string itemText)) { itemText = Convert.ToString(item); } if (Context.CsvNanValue == itemText) { return; } if (item is double number) { value = number; } }); }