7

我开始使用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值;为此,我创建了一个类映射:trueyesFalseno

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();
}

不幸的是,当我检查所写的内容时,我发现我仍然得到TrueFalse- 不是我所希望的yes那样no......

我在这里想念什么?我正在使用从 NuGet 和 .NET 4.0 / Visual Studio 2010 安装的 CSV-Helper v2.5。

4

2 回答 2

17

TypeConverterOption仅在读取时使用布尔值重载。它允许您在读取时指定多个可用于真/假的值。所以你可以做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>();
于 2014-04-10T20:48:03.433 回答
5

接受的解决方案不适用于最新版本。我正在使用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);
于 2020-08-21T13:08:54.450 回答