我有这样的csv,只有字符串值的引号,并且它使用不带引号的空字符串来表示空值。例如,一行是:
1,"",2
对于这一行,第二个字段表示空字符串。另一行是:
1,,2
对于这一行,第二个字段表示空值。
我想知道 csvhelper 是否可以处理此类 csv 文件。
我尝试将以下行添加到我的代码中,但 csvhelper 会将这两行的第二个字段识别为空值。
csvReader.Context.TypeConverterOptionsCache.GetOptions<string>().NullValues.Add("");
我想知道是否有某种方法可以正确解析此类 csv。
不幸的是,
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; }
}