CsvHelper 绝对可以处理可为空的类型。如果空白列被视为空,则不需要滚动自己的 TypeConverter。对于我的示例,我假设您使用的是用户定义的流畅映射。
您需要做的第一件事是CsvHelper.TypeConverter
为您的 Nullable 类型构造一个对象。请注意,我将使用int
默认情况下字符串允许空值。
public class MyClassMap : CsvClassMap<MyClass>
{
public override CreateMap()
{
CsvHelper.TypeConversion.NullableConverter intNullableConverter = new CsvHelper.TypeConversion.NullableConverter(typeof(int?));
Map(m => m.number).Index(2).TypeConverter(intNullableConverter);
}
}
接下来是在您的 CsvReader 对象上设置属性以允许空白列和自动修剪您的字段。CsvConfiguration
个人喜欢通过在构建对象之前使用我的所有设置创建一个对象来做到这一点CsvReader
。
CsvConfiguration csvConfig = new CsvConfiguration();
csvConfig.RegisterClassMap<MyClassMap>();
csvConfig.WillThrowOnMissingField = false;
csvConfig.TrimFields = true;
然后你可以调用myReader = new CsvReader(stream, csvConfig)
来构建CsvReader
对象。
如果您需要为 null 定义值,"NA" == null
那么您将需要推出自己的CsvHelper.TypeConversion
课程。我建议您扩展NullableConverter
类来执行此操作并覆盖构造函数和ConvertFromString
方法。不过,使用空白值作为 null 确实是您最好的选择。