将可检测的Nullable值添加到CsvHelper

Mat*_*ers 8 string nullable csvhelper

我想知道Josh Close的CsvHelper是否有任何配置我缺少将值转换为null.我是这个库的忠实粉丝,但我一直认为应该有某种配置让它知道你的文件中什么值代表NULL.一个例子是一个值为"NA","EMPTY","NULL"等的列.我确信我可以创建自己的TypeConverter,但我希望有一个更简单的选项来设置配置中的某个位置对于我遇到的文件,这往往相当普遍.

是否有相对容易的配置设置?

我在CsvHelper.TypeConversion命名空间中找到了TypeConversion,但我不知道在哪里应用这样的东西或正确用法的例子:

new NullableConverter(typeof(string)).ConvertFromString(new TypeConverterOptions(), "NA")
Run Code Online (Sandbox Code Playgroud)

我也在使用最新版本2.2.2

谢谢!

Lee*_*son 18

我认为在过去七年和十三个版本中的某个时候,这个问题被问到了在没有扩展自定义类型映射类的情况下执行此操作的选项,例如:

csvReader.Context.TypeConverterOptionsCache.GetOptions<string>().NullValues.Add("NULL");
csvReader.Context.TypeConverterOptionsCache.GetOptions<DateTime?>().NullValues.AddRange(new[] { "NULL", "0" });
csvReader.Context.TypeConverterOptionsCache.GetOptions<int?>().NullValues.Add("NULL");
csvReader.Context.TypeConverterOptionsCache.GetOptions<bool>().BooleanFalseValues.Add("0");
csvReader.Context.TypeConverterOptionsCache.GetOptions<bool>().BooleanTrueValues.Add("1");
Run Code Online (Sandbox Code Playgroud)

  • 对于 2021 年 (v22.1.2) 刚接触 CsvHelper 的人来说,“TypeConverterOptionsCache”不再位于“Configuration”属性上。现在是:“csvReader.Context.TypeConverterOptionsCache.GetOptions&lt;&gt;”。不确定它什么时候改变,但我想我会把它放在那里:) (3认同)

JNY*_*ger 13

CsvHelper绝对可以处理可空类型.如果空白列被视为null,则无需滚动自己的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);
      }
 }
Run Code Online (Sandbox Code Playgroud)

接下来是在CsvReader对象上设置属性以允许空白列并自动修剪字段.个人喜欢CsvConfiguration在构造我的CsvReader对象之前通过创建具有所有设置的对象来完成此操作.

CsvConfiguration csvConfig = new CsvConfiguration();
csvConfig.RegisterClassMap<MyClassMap>();
csvConfig.WillThrowOnMissingField = false;
csvConfig.TrimFields = true;
Run Code Online (Sandbox Code Playgroud)

然后你可以调用myReader = new CsvReader(stream, csvConfig)构建CsvReader对象.

如果您需要为null定义值,"NA" == null那么您将需要滚动自己的CsvHelper.TypeConversion类.我建议您扩展NullableConverter类来执行此操作并覆盖构造函数和ConvertFromString方法.使用空值作为null确实是你最好的选择.