'CsvHelper mapping issue

I have a question related to CsvHelper library and I cannot figure out how to map a csv file to the following MyClass object. the csv file look like:

id, Property1, property2....
1, x, a,b,c
2,x, d,f
3, y, g,h,i,j,k 
...

Which I would like to parse to the following classes

public class MyClass
{
    public string Id { get; set; }

    public List<Custom> MyCustoms { get; set; }
}

public class Custom
{
    public string Property1 { get; set; }

    public List<string> Property2 { get; set; }
}


Solution 1:[1]

ConvertUsing is going to be the easiest way to map this.

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,Property1,Property2,Property3,Property4,Property5,Property6");
            writer.WriteLine("1,x,a,b,c");
            writer.WriteLine("2,x,d,f");
            writer.WriteLine("3,y,g,h,i,j,k");
            writer.Flush();
            stream.Position = 0;

            var test = csv.Configuration.RegisterClassMap<MyClassMap>();

            var records = csv.GetRecords<MyClass>().ToList();
        } 
    }
}

public class MyClassMap: ClassMap<MyClass>
{
    public MyClassMap()
    {
        Map(m => m.Id);
        Map(m => m.MyCustoms).ConvertUsing(row =>
        {
            var custom = new Custom 
            { 
                Property1 = row["Property1"], 
                Property2 = new List<string>() 
            };

            var index = 2;

            while (row.TryGetField(typeof(string), index, out var property))
            {
                custom.Property2.Add((string)property);
                index++;
            }

            return new List<Custom> { custom };
        });
    }
}

public class MyClass
{
    public string Id { get; set; }

    public List<Custom> MyCustoms { get; set; }
}

public class Custom
{
    public string Property1 { get; set; }

    public List<string> Property2 { get; set; }
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 David Specht