Search code examples
csvhelper

CSV Helper Convert String into DateTime


Need a way to Convert a string in the format "yyyyMMDD" in the csv file into DateTime format "MM/DD/YYYY" using CsvHelper nuget package.


Solution

  • Updated for version 20.0+

    Setting the TypeConverterOption for individual DateTime properties.

    public class Program
    {
        static void Main(string[] args)
        {
            using (var stream = new MemoryStream())
            using (var writer = new StreamWriter(stream))
            using (var reader = new StreamReader(stream))
            using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
            {
                writer.WriteLine("Id,Name,Date");
                writer.WriteLine("1,one,20200623");
                writer.WriteLine("2,two,20190622");
                writer.Flush();
                stream.Position = 0;
    
                csv.Context.RegisterClassMap<TestMap>();
                var records = csv.GetRecords<Test>().ToList();
            }
        }
    }
    
    public class Test
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public DateTime Date { get; set; }
    }
    
    public sealed class TestMap : ClassMap<Test>
    {
        public TestMap()
        {
            Map(m => m.Id);
            Map(m => m.Name);
            Map(m => m.Date).TypeConverterOption.Format("yyyyMMdd");
        }
    }
    

    Setting the TypeConverterOptions for all DateTime properties.

    static void Main(string[] args)
    {
        using (var stream = new MemoryStream())
        using (var writer = new StreamWriter(stream))
        using (var reader = new StreamReader(stream))
        using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
        {
            writer.WriteLine("Id,Name,Date");
            writer.WriteLine("1,one,20200623");
            writer.WriteLine("2,two,20190622");
            writer.Flush();
            stream.Position = 0;
    
            var options = new TypeConverterOptions { Formats = new[] { "yyyyMMdd" } };
            csv.Context.TypeConverterOptionsCache.AddOptions<DateTime>(options);
    
            var records = csv.GetRecords<Test>().ToList();
        }
    }