using System.Collections;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
using System.Collections.ObjectModel;
using CsvHelper.Configuration;
using CsvHelper.Configuration.Attributes;
using CsvHelper.Expressions;
using CsvHelper.TypeConversion;
public string Data1 { get; set; }
public string DataN { get; set; }
public string DataN1 { get; set; }
class DtoMap : ClassMap<Dto>
public DtoMap() : this(true) { }
public DtoMap(bool includeEmptyColumns)
Map(x => x.Data1).Index(0);
for (int i = 1; i < N; i++)
Map().Index(i).Constant("").Name($"Column {i}");
Map(x => x.DataN).Index(N);
Map(x => x.DataN1).Index(N + 1);
static byte [] CreateCSV<TMap, TRecords>(IEnumerable<TRecords> records, CsvConfiguration csvConfiguration) where TMap : ClassMap<TRecords>
using (var memoryStream = new MemoryStream())
using (var streamWriter = new StreamWriter(memoryStream))
using (var csvWriter = new CsvWriter(streamWriter, csvConfiguration))
csvWriter.Context.RegisterClassMap<TMap>();
csvWriter.WriteRecords(records);
return memoryStream.ToArray();
static List<TRecords> ReadCSV<TRecords>(byte [] data, ClassMap<TRecords> map, CsvConfiguration csvConfiguration)
using (var memoryStream = new MemoryStream(data))
using (var streamWriter = new StreamReader(memoryStream))
using (var csvReader = new CsvReader(streamWriter, csvConfiguration))
csvReader.Context.RegisterClassMap(map);
return csvReader.GetRecords<TRecords>().ToList();
public static void Test()
var config = new CsvConfiguration(CultureInfo.InvariantCulture);
var csv = CreateCSV<DtoMap, Dto>(records, config);
Console.WriteLine(Encoding.UTF8.GetString(csv));
var newRecords = ReadCSV(csv, new DtoMap(false), config);
var csv2 = CreateCSV<DtoMap, Dto>(newRecords, config);
Console.WriteLine(Encoding.UTF8.GetString(csv2));
public static void Main()
Console.WriteLine("Environment version: {0} ({1})", System.Runtime.InteropServices.RuntimeInformation.FrameworkDescription , GetNetCoreVersion());
Console.WriteLine("CsvHelper: " + typeof(CsvConfiguration).Assembly.FullName);
Console.WriteLine("Failed with unhandled exception: ");
public static string GetNetCoreVersion()
var assembly = typeof(System.Runtime.GCSettings).GetTypeInfo().Assembly;
var assemblyPath = assembly.CodeBase.Split(new[] { '/', '\\' }, StringSplitOptions.RemoveEmptyEntries);
int netCoreAppIndex = Array.IndexOf(assemblyPath, "Microsoft.NETCore.App");
if (netCoreAppIndex > 0 && netCoreAppIndex < assemblyPath.Length - 2)
return assemblyPath[netCoreAppIndex + 1];