我试图将CsvWriter配置为使用特殊字符串&#34; #NULL#&#34;可以为空的字符串属性。对于读者来说,通过设置csvReader.Configuration.TypeConverterOptionsCache.GetOptions<string>().NullValues.Add("#NULL#");
它可以工作 - 它读取&#34; #NULL#&#34; csv中的字段为空字符串。
我用于编写器的代码如下,但它忽略了添加的NullValues并输出空字符串(默认行为)。 是否有编写器的其他配置参数?感谢。
public class Entity
{
public string Name { get; set; }
public int Id { get; set; }
}
[Test]
public void csv_write_test()
{
var entities = new[] {new Entity {Id = 1, Name = null}, new Entity {Id=2, Name = "SampleName"} };
var fileName = "C:/Temp/tr/recordings/withNulls/sample-test.csv";
File.Delete(fileName);
using (var textWriter = new StreamWriter(fileName))
{
var csvWriter = new CsvWriter(textWriter);
csvWriter.Configuration.TypeConverterOptionsCache.GetOptions<string>().NullValues.Add("#NULL#");
csvWriter.WriteRecords(entities);
}
}
答案 0 :(得分:2)
您可以使用自定义void Main()
{
using (var stream = new MemoryStream())
using (var writer = new StreamWriter(stream))
using (var reader = new StreamReader(stream))
using (var csv = new CsvWriter(writer))
{
var records = new List<Test>
{
new Test { Id = 1, Name = "one" },
new Test { Id = 2, Name = null },
};
csv.Configuration.RegisterClassMap<TestMap>();
csv.WriteRecords(records);
writer.Flush();
stream.Position = 0;
reader.ReadToEnd().Dump();
}
}
public class Test
{
public int Id { get; set; }
public string Name { get; set; }
}
public sealed class TestMap : ClassMap<Test>
{
public TestMap()
{
Map(m => m.Id);
Map(m => m.Name).TypeConverter<CustomNullTypeConverter<string>>();
}
}
public class CustomNullTypeConverter<T> : DefaultTypeConverter
{
public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
{
if (value == null)
{
return "#NULL#";
}
var converter = row.Configuration.TypeConverterCache.GetConverter<T>();
return converter.ConvertToString(value, row, memberMapData);
}
}
来完成此操作。
NullValues
如果您希望它使用{{1}}选项中的第一个值,则您需要提交功能请求。