【问题标题】:Using the CsvHelper library, how can I read an empty field as null rather than an empty string?使用 CsvHelper 库,如何将空字段读取为 null 而不是空字符串?
【发布时间】:2021-04-24 13:32:48
【问题描述】:

我正在使用 Josh Close 的 CsvHelper 库。

我想将 CsvReader 配置为将空字段转换为 null 而不是空字符串,以便将这些值存储在数据库中。

值得注意的是,我没有映射到一个类,而是手动读取字段。

尝试:

  1. 我尝试将 CsvConfiguration.UseNewObjectForNullReferenceMembers 设置为 false(默认为 true),我认为这可能意味着它在找到空字段时不会创建“新字符串对象”。
  2. 我尝试添加一个自定义类型转换器,它扩展了 TypeConversion.StringConverter 并覆盖了 ConvertFromString 方法。
  3. 我尝试向 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);
        } 
    }
}

【问题讨论】:

  • 这能回答你的问题吗? Adding detectable Nullable values to CsvHelper
  • 我在搜索我的问题的答案时看到了该链接,但它没有帮助。我没有映射像 MyClassMap 这样的类。它专注于可空的 int 而不是字符串,因为“字符串默认允许空值”。它建议的两种解决方案,使用 TypeConverterOptionsCache 或创建自定义 TypeConverter,都依赖于将字符串类型显式传递给 GetField 函数。所以对我来说,这是其他地方无法获得的关键信息。

标签: c# .net type-conversion csvhelper


【解决方案1】:

关键是我使用了 CsvReader 的 GetField 函数的错误重载。在阅读函数描述中的差异时,事后看来这有点明显,但我认为这很容易被忽视,因此希望这可以在未来对其他人有所帮助,因为其他性质相似的问题并没有让我得到这个答案。

之前:

string value = csv.GetField(index); // Gets the raw field

之后:

string value = csv.GetField<string>(index); // Gets the field converted to a string

StringConverter 似乎不默认使用 null 而不是空字符串,因此我还需要在最初尝试时使用选项 2 或 3 更改配置。选项 2 似乎更简单,所以这就是我采用的解决方案。

CsvConfiguration csvConfiguration = new CsvConfiguration(CultureInfo.InvariantCulture);

csvConfiguration.TypeConverterOptionsCache.GetOptions<string>().NullValues.Add("");

using (StreamReader streamReader = new StreamReader(fileStream))
using (CsvReader csv = new CsvReader(streamReader, csvConfiguration))
{
    string value = csv.GetField<string>(index); // Yay this returns null!
}

【讨论】:

    猜你喜欢
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 2016-07-29
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多