我开始使用CSV Helper - 一个出色的小帮手,适合你的日常工作 - 很棒的东西!
我现在正在努力的一个项目是类地图 - 我有一个小班级
public class SimpleClass
{
public int ID { get; set; }
public string Name { get; set; }
public decimal Percentage { get; set; }
public bool IsValid { get; set; }
}
并且要导出为CSV,我想将IsValid
值true
替换为yes
,将False
替换为no
;为此,我创建了一个班级地图:
public class SimpleClassMap : CsvClassMap<SimpleClass>
{
public override void CreateMap()
{
Map(x => x.ID).Index(0);
Map(x => x.Name).Index(1);
Map(x => x.Percentage).Index(2);
Map(x => x.IsValid).Index(3)
.TypeConverterOption(true, "yes")
.TypeConverterOption(false, "no");
}
}
现在在导出我的数据时,我正在使用该类地图:
CsvConfiguration config = new CsvConfiguration { Delimiter = ";", HasHeaderRecord = false, Quote = '"' };
config.RegisterClassMap<SimpleClassMap>();
using (MemoryStream stm = new MemoryStream())
using (var streamWriter = new StreamWriter(stm))
using (var csvWriter = new CsvWriter(streamWriter, config))
{
csvWriter.WriteRecords(list);
streamWriter.Flush();
}
不幸的是,当我检查所写的内容时,我发现我仍然得到True
或False
- 而不是我所希望的yes
或no
。 ...
我在这里缺少什么?我使用的是从NuGet和.NET 4.0 / Visual Studio 2010安装的CSV-Helper v2.5。
答案 0 :(得分:13)
TypeConverterOption
的布尔值重载仅在读取时使用。它允许您指定在读取时可用于true / false的多个值。因此,您可以执行1
,"true"
,"TRUE"
,"True"
,"yes"
等。
目前写作时唯一的方法是创建自定义类型转换器。
public class MyBooleanConverter : DefaultTypeConverter
{
public override string ConvertToString( TypeConverterOptions options, object value )
{
if( value == null )
{
return string.Empty;
}
var boolValue = (bool)value;
return boolValue ? "yes" : "no";
}
}
然后,您可以将其应用于全球所有布尔值。
CsvHelper.TypeConversion.TypeConverterFactory.AddConverter<bool>( new MyBooleanConverter() );
或通过映射将其应用于单个属性。
Map( m => m.MyBoolProperty ).TypeConverter<MyBooleanConverter>();
答案 1 :(得分:2)
可接受的解决方案不适用于最新版本。我正在使用CsvHelper 15.0.0
,这就是它的工作原理。
public class MyBooleanConverter : DefaultTypeConverter
{
public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
{
if( value == null )
{
return string.Empty;
}
var boolValue = (bool)value;
return boolValue ? "yes" : "no";
}
}
应用于单个属性:
Map(x => x.IsValid).Index(3).TypeConverter<MyBooleanConverter>();
从读取器/写入器的配置中应用:
using var csvWriter = new CsvWriter(new StreamWriter(path), CultureInfo.InvariantCulture);
csvWriter.Configuration.TypeConverterCache.AddConverter<bool>(new MyBooleanConverter());
csvWriter.WriteRecords(data);