首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CsvHelper库,如何将空字段读取为null而不是空字符串?

使用CsvHelper库,如何将空字段读取为null而不是空字符串?
EN

Stack Overflow用户
提问于 2021-01-20 07:56:20
回答 1查看 2.9K关注 0票数 2

我正在使用乔希·克洛斯的CsvHelper库。

我希望将CsvReader配置为将空字段转换为空字段,而不是空字符串,目的是将这些值存储在数据库中。

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

尝试:

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

回答 1

Stack Overflow用户

发布于 2021-01-20 07:56:20

关键是我使用了CsvReader的GetField函数的过载错误。当阅读函数描述的差异时,这一点在事后看来有些明显,但我认为这很容易被忽略,因此希望这能在将来帮助其他人,因为其他本质上类似的问题并没有让我回答这个问题。

在此之前:

代码语言:javascript
复制
string value = csv.GetField(index); // Gets the raw field

之后:

代码语言:javascript
复制
string value = csv.GetField<string>(index); // Gets the field converted to a string

StringConverter似乎并不默认使用null而不是空字符串,所以我还需要使用选项2或3来更改配置。选项2看起来要简单得多,所以这就是我所使用的解决方案。

代码语言:javascript
复制
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!
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65805247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档