2014-03-31 3 views
5

Ich fange an CSV Helper zu verwenden - ein exzellenter kleiner Helfer für Ihre tägliche Arbeit - tolle Sachen!Problem mit CSV-Helper konvertiert keine bool Werte

Ein Artikel Ich kämpfe mit Recht sind jetzt Klasse Karten - I

public class SimpleClass 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public decimal Percentage { get; set; } 
    public bool IsValid { get; set; } 
} 

und für den Export in das CSV ein wenig Klasse haben, würde Ich mag die IsValid Werte true mit yes ersetzen, False mit no; Zu diesem Zweck habe ich eine Klasse Karte erstellt:

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

und jetzt, wenn meine Daten exportieren, verwende ich diese Klasse Karte:

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

Leider, wenn ich prüfen, was geschrieben wurde, zu sehen, die ich, dass ich immer noch True oder False - nicht die yes oder no wie ich gehofft hatte .....

Was bin ich hier? Ich verwende CSV-Helper v2.5, installiert von NuGet und .NET 4.0/Visual Studio 2010.

Antwort

11

Die booleschen Werte Überladung für TypeConverterOption wird nur beim Lesen verwendet. Sie können mehrere Werte angeben, die beim Lesen als wahr/falsch verwendet werden können. So könnte man 1 tun, "true", "TRUE", "True", "yes" usw.

derzeit den einzigen Weg, es zu tun, wenn das Schreiben ist ein benutzerdefinierter Typ Konverter zu erstellen.

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"; 
    } 
} 

Sie können es dann global auf alle Booleschen Werte anwenden.

CsvHelper.TypeConversion.TypeConverterFactory.AddConverter<bool>(new MyBooleanConverter()); 

Oder wenden Sie es über das Mapping auf eine einzelne Eigenschaft an.

Map(m => m.MyBoolProperty).TypeConverter<MyBooleanConverter>(); 
+1

Ja, ich weiß. :(In der nächsten Hauptversion werden die Konfigurationen durch Reader und Writer getrennt, anstatt durch einen großen Konfigurations-Pool. –

+0

Gibt es eine Möglichkeit, einen Wert an den TypeConvertor zu übergeben? Ich möchte grundsätzlich alle NULL-Werte durch eine bestimmte Länge ersetzen string (Füllfelder in der CSV, um eine Spezifikation zu erfüllen) – Andrew

+0

Können Sie dies auf der GitHub-Problemseite posten? Wir können Code-Beispiele auf diese Weise teilen.https: //github.com/JoshClose/CsvHelper/issues –