Я пытаюсь загрузить данные из CSV-файла с помощью CsvHelper, чтобы создать таблицу данных с столбцами данных указанного типа.
var textReader = new StreamReader(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"{tableName}.csv"));
var csvReader = new CsvReader(textReader);
var csvDataReader = new CsvDataReader(csvReader);
var dataTable = new DataTable();
foreach(var column in metaColumns)
{
var dataColumn = new DataColumn(column.columnName, GetPropertyType(column.dataType));
dataColumn.AllowDBNull = column.isNull;
dataTable.Columns.Add(dataColumn);
}
dataTable.Load(csvDataReader);
В методе загрузки я получаю следующую ошибку:
Строка '' не была распознана как допустимое значение DateTime. Не удалось сохранить <> в столбце output_mdd_date.Ожидаемый тип - DateTime.
Очевидно, CsvHelper загружает столбец из файла CSV в виде пустой строки, а затем, когда ему присваивается тип DateTime, он не преобразует пустую строку в нулевое значение.
После некоторых исследований и просто попыток я добавил
csvReader.Configuration.TypeConverterOptionsCache.GetOptions<DateTime>().NullValues.Add("null");
csvReader.Configuration.TypeConverterOptionsCache.GetOptions<DateTime?>().NullValues.Add("null");
csvReader.Configuration.TypeConverterOptionsCache.GetOptions<string>().NullValues.Add("null");
csvReader.Configuration.TypeConverterCache.AddConverter<DateTime>(new DateFieldConverter());
csvReader.Configuration.TypeConverterCache.AddConverter<DateTime?>(new DateFieldConverter());
...
public class DateFieldConverter : DateTimeConverter
{
public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
{
bool result = DateTime.TryParse(text, out DateTime ret);
if (result) return ret;
return null;
}
}
Все еще получаю ту же ошибку.Я установил точку останова на DateFieldConverter, и он никогда не срабатывает, поэтому что-то не синхронизируется правильно.Я думаю, что поведением по умолчанию для столбца DateTime будет DateTime.MinValue или null, но вместо этого просто выдается ошибка.