Search code examples
c#csvhelper

CsvHelper - read in multiple columns to a single list


I'm using CSVHelper to read in lots of data

I'm wondering if it's possible to read the last n columns in and transpose them to a list

"Name","LastName","Attribute1","Attribute2","Attribute3"

And mould the data into something like this

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public IList<string> Attributes { get; set; }
}

I'm looking to do this in one step, I'm sure I could have an intermediate step where I put into an object with matching attribute properties but it would be nice to do it on a one-er


Solution

  • This does the trick as a mapper.

    public sealed class PersonMap : CsvClassMap<Person>
    {
        private List<string> attributeColumns = 
            new List<string> { "Attribute1", "Attribute2", "Attribute3" };
    
        public override void CreateMap()
        {
            Map(m => m.FirstName).Name("FirstName").Index(0);
            Map(m => m.LastName).Name("LastName").Index(1);
            Map(m => m.Attributes).ConvertUsing(row =>
                attributeColumns
                    .Select(column => row.GetField<string>(column))
                    .Where(value => String.IsNullOrWhiteSpace(value) == false)
                );
        }
    }
    

    Then you just need something like this

    using (var reader = new CsvReader(new StreamReader(filePath)))
    {
        reader.Configuration.RegisterClassMap<PersonMap>();
        while (reader.Read())
        {
            var card = reader.GetRecord<Person>();
        }
    }