【发布时间】:2019-05-08 20:19:35
【问题描述】:
我正在尝试使用 CsvHelper 从 CSV 文件加载数据,以创建具有指定类型的数据列的数据表。
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);
在加载方法上出现以下错误:
String '' 未被识别为有效的 DateTime。无法将 存储在 derived_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 但它只是抛出错误。
【问题讨论】: