2017-02-09 2 views
1

Mit CsvHelper, wenn ich einen benutzerdefinierten Parser will (zum Beispiel möchte ich ein MyBooleanConverter mit der Eingabezeichenfolge ist „f“ wird falsch sein, „t“ wird „true“). Aber mit jeder Klasse Ich habe Mapper schreiben:CsvHelper Set benutzerdefinierte Standardtypeconverter

public sealed class MyClassMap : CsvClassMap<MyClass> 
{ 
    public MyClassMap() 
    { 
     Map(m => m.Id).Index(0).TypeConverter<MyBooleanConverter>(); 
    } 
} 

Oder

[CsvHelper.TypeConversion.TypeConverter(typeof(MyBooleanConverter))] 
public Boolean MyObjectProperty { get; set; } 

Wie kann ich MyBooleanConverter als Standard festgelegt für jedes boolean Feld und jede Klasse?

Antwort

1

Die CsvHelper-Bibliothek zeigt eine statische TypeConverterFactory. Sie können den booleschen Standardkonverter einfach entfernen und Ihren benutzerdefinierten Konverter hinzufügen, um ihn zu ersetzen.

TypeConverterFactory.RemoveConverter<bool>(); 
TypeConverterFactory.AddConverter<bool>(new MyBooleanConverter()); 
0

Fügen Sie einfach meinen Codeausschnitt in den folgenden Beitrag ein, um die in CsvHelper integrierten Typkonverter zu verstehen. Ich musste mit Daten im folgenden Format "yyyyMMdd" umgehen und es schien den Trick zu machen, CSV ohne den .Net DateTime Parse Fehler zu schreiben: "String wurde nicht als gültige DateTime erkannt."

using (TextWriter writer = new StreamWriter(csvLocaitonAndName)) 
     { 
      var csvUpdate = new CsvWriter(writer); 
      csvUpdate.Configuration.TypeConverterCache.AddConverter<DateTime?>(new DateConverter("yyyyMMdd")); 
      csvUpdate.Configuration.HasHeaderRecord = false; 
      csvUpdate.WriteRecords(list); 
     } 

public class DateConverter : ITypeConverter 
    { 
     private readonly string _dateFormat; 

     public DateConverter(string dateFormat) 
     { 
      _dateFormat = dateFormat; 
     } 

     public object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData) 
     { 
      if (!string.IsNullOrEmpty(text)) 
      { 
       DateTime dt; 
       DateTime.TryParseExact(text, _dateFormat, 
             CultureInfo.InvariantCulture, 
             DateTimeStyles.None, 
             out dt); 
       if (IsValidSqlDateTime(dt)) 
       { 
        return dt; 
       } 

      } 

      return null; 
     } 
     public string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData) 
     { 
      return ObjectToDateString(value, _dateFormat); 
     } 

     public string ObjectToDateString(object o, string dateFormat) 
     { 
      if (o == null) return string.Empty; 

      DateTime dt; 
      if (DateTime.TryParse(o.ToString(), out dt)) 
       return dt.ToString(dateFormat); 
      else 
       return string.Empty; 
     } 
     public bool IsValidSqlDateTime(DateTime? dateTime) 
     { 
      if (dateTime == null) return true; 

      DateTime minValue = DateTime.Parse(System.Data.SqlTypes.SqlDateTime.MinValue.ToString()); 
      DateTime maxValue = DateTime.Parse(System.Data.SqlTypes.SqlDateTime.MaxValue.ToString()); 

      if (minValue > dateTime.Value || maxValue < dateTime.Value) 
       return false; 

      return true; 
     } 
Verwandte Themen