using System.Collections.Generic;
using System.Globalization;
using CsvHelper.Configuration;
public static void Main()
MemoryStream csv = MakeInMemoryCsvWithUglyColumnNames();
IEnumerable<RecordModel> records = ReadInMemoryCsvWithFieldMap(csv);
foreach (var r in records)
public static MemoryStream MakeInMemoryCsv() {
var records = new List<RecordModel>
new RecordModel() { ID = "slkdfj", Name = "George" },
var memoryStream = new MemoryStream();
TextWriter writer = new StreamWriter(memoryStream);
var csv = new CsvWriter(writer, CultureInfo.InvariantCulture);
csv.WriteRecords(records);
memoryStream.Seek(0, SeekOrigin.Begin);
public static MemoryStream MakeInMemoryCsvWithUglyColumnNames() {
new { rand234 = "2345", reallyBad_ColuMnNaMe__plzFix = "George" },
new { rand234 = "3", reallyBad_ColuMnNaMe__plzFix = "Fred" },
new { rand234 = "23", reallyBad_ColuMnNaMe__plzFix = "Elaine" },
new { rand234 = "5", reallyBad_ColuMnNaMe__plzFix = "Simon" },
new { rand234 = "2", reallyBad_ColuMnNaMe__plzFix = "Ginger" },
new { rand234 = "8", reallyBad_ColuMnNaMe__plzFix = "Roger" },
var memoryStream = new MemoryStream();
TextWriter writer = new StreamWriter(memoryStream);
var csv = new CsvWriter(writer, CultureInfo.InvariantCulture);
csv.WriteRecords(records);
memoryStream.Seek(0, SeekOrigin.Begin);
public static IEnumerable<RecordModel> ReadInMemoryCsv(MemoryStream memoryStream) {
var reader = new StreamReader(memoryStream);
var csv = new CsvReader(reader, CultureInfo.InvariantCulture);
foreach (var r in csv.GetRecords<RecordModel>())
return csv.GetRecords<RecordModel>();
public static IEnumerable<RecordModel> ReadInMemoryCsvWithFieldMap(MemoryStream memoryStream) {
var reader = new StreamReader(memoryStream);
var csv = new CsvReader(reader, CultureInfo.InvariantCulture);
csv.Context.RegisterClassMap<RecordModelFieldMap>();
RecordModel record = new();
IEnumerator<RecordModel> enumerator = csv.EnumerateRecords(record).GetEnumerator();
bool hasRecord = enumerator.MoveNext();
List<RecordModel> records = new();
records.Add(record.Clone());
hasRecord = enumerator.MoveNext();
public class RecordModelFieldMap: ClassMap<RecordModel> {
public RecordModelFieldMap() {
Map(m => m.Name).Name("Name", "reallyBad_ColuMnNaMe__plzFix");
Map(m => m.ID).Name("ID", "rand234");
public class RecordModel {
public string Name {get;set;}
public string ID {get;set;}
public override string ToString() {
return $"Name: {Name}, ID: {ID}";
public RecordModel Clone() {