如何让csvhelper区分null和空字符串

问题描述 投票:0回答:1

我有这样的csv,只有字符串值的引号,并且它使用不带引号的空字符串来表示空值。例如,一行是:

1,"",2
对于这一行,第二个字段表示空字符串。另一行是:
1,,2
对于这一行,第二个字段表示空值。 我想知道 csvhelper 是否可以处理此类 csv 文件。

我尝试将以下行添加到我的代码中,但 csvhelper 会将这两行的第二个字段识别为空值。

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

我想知道是否有某种方法可以正确解析此类 csv。

csvhelper
1个回答
0
投票

不幸的是,

CsvHelper
无法使用
String.Empty
null
来区分
1,"",2
1,,2
。您能做的最好的事情就是将特定的字符串值设为空值,例如使用
"null"
。然后,您可以为您的
CsvWriter
编写一个自定义转换器,该转换器始终将空字符串写入
"null"
或您想要用来指示
null
值的任何值。

您可以在 Github 上找到关于此问题的讨论

void Main()
{
    var fileName = @"C:\Temp\NullString.csv";
    
    var records = new List<Foo> {
        new Foo { Id = 1, Name = String.Empty },
        new Foo { Id = 2, Name = null }
    };
    
    using (var writer = new StreamWriter(fileName))
    using (var csvWriter = new CsvWriter(writer, CultureInfo.InvariantCulture))
    {
        csvWriter.Context.TypeConverterCache.AddConverter<string>(new NullStringConverter());
        csvWriter.WriteRecords(records);
    }
    
    using (var reader = new StreamReader(fileName))
    using (var csvReader = new CsvReader(reader, CultureInfo.InvariantCulture))
    {
        csvReader.Context.TypeConverterOptionsCache.GetOptions<string>().NullValues.Add("null");
        
        var result = csvReader.GetRecords<Foo>().Dump();
    }
}

public class NullStringConverter : StringConverter
{
    public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
    {
        if ((string)value == null)
            return "null";

        return base.ConvertToString(value, row, memberMapData);
    }
}

public class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
}
© www.soinside.com 2019 - 2024. All rights reserved.