CsvHelper set default custom TypeConverter

前端 未结 3 1438
离开以前
离开以前 2020-12-21 04:05

With CsvHelper, when I want a custom parser (for example, I want a MyBooleanConverter with the input string is \"f\" will be false, \"t\" will

3条回答
  •  死守一世寂寞
    2020-12-21 05:08

    Just adding my code snippet to the following post to help understand the Type Converters built into CsvHelper. I needed to handle dates in the following format "yyyyMMdd" and it seemed to do the trick writing back and forth to CSV without the .net DateTime Parse error: "String was not recognized as a valid DateTime."

    using (TextWriter writer = new StreamWriter(csvLocaitonAndName))
            {
                var csvUpdate = new CsvWriter(writer);
                csvUpdate.Configuration.TypeConverterCache.AddConverter(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;
            }
    

提交回复
热议问题