Esempio n. 1
0
        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
            });
        }
Esempio n. 2
0
        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;
                        }
                    });
                }