我正在使用乔希·克洛斯的CsvHelper库。
我希望将CsvReader配置为将空字段转换为空字段,而不是空字符串,目的是将这些值存储在数据库中。
值得注意的是,我不是映射到类,而是手动读取字段。
尝试:
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);
}
}
}发布于 2021-01-20 07:56:20
关键是我使用了CsvReader的GetField函数的过载错误。当阅读函数描述的差异时,这一点在事后看来有些明显,但我认为这很容易被忽略,因此希望这能在将来帮助其他人,因为其他本质上类似的问题并没有让我回答这个问题。
在此之前:
string value = csv.GetField(index); // Gets the raw field之后:
string value = csv.GetField<string>(index); // Gets the field converted to a stringStringConverter似乎并不默认使用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!
}https://stackoverflow.com/questions/65805247
复制相似问题