【发布时间】:2021-04-24 13:32:48
【问题描述】:
我正在使用 Josh Close 的 CsvHelper 库。
我想将 CsvReader 配置为将空字段转换为 null 而不是空字符串,以便将这些值存储在数据库中。
值得注意的是,我没有映射到一个类,而是手动读取字段。
尝试:
- 我尝试将 CsvConfiguration.UseNewObjectForNullReferenceMembers 设置为 false(默认为 true),我认为这可能意味着它在找到空字段时不会创建“新字符串对象”。
- 我尝试添加一个自定义类型转换器,它扩展了 TypeConversion.StringConverter 并覆盖了 ConvertFromString 方法。
- 我尝试向 CsvConfiguration.TypeConverterOptions.getOptions.NullValues 添加一个空字符串。
CsvConfiguration csvConfiguration = new CsvConfiguration(CultureInfo.InvariantCulture);
//csvConfiguration.UseNewObjectForNullReferenceMembers = false;
//csvConfiguration.TypeConverterOptionsCache.GetOptions<string>().NullValues.Add("");
//csvConfiguration.TypeConverterCache.AddConverter<string>(new NullStringConverter());
using (StreamReader streamReader = new StreamReader(fileStream))
using (CsvReader csv = new CsvReader(streamReader, csvConfiguration))
{
string value = csv.GetField(index); // <-- I want this to be null not ""
}
public class NullStringConverter : StringConverter
{
public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
{
if (string.IsNullOrEmpty(text))
{
return null;
}
else
{
return base.ConvertFromString(text, row, memberMapData);
}
}
}
【问题讨论】:
-
我在搜索我的问题的答案时看到了该链接,但它没有帮助。我没有映射像 MyClassMap 这样的类。它专注于可空的 int 而不是字符串,因为“字符串默认允许空值”。它建议的两种解决方案,使用 TypeConverterOptionsCache 或创建自定义 TypeConverter,都依赖于将字符串类型显式传递给 GetField 函数。所以对我来说,这是其他地方无法获得的关键信息。
标签: c# .net type-conversion csvhelper