Search code examples
c#csvhelper

Saving source line in property using CSV Helper


I have this simple class

public class Data
{
   public int Id { get; set; }
   public string Name { get; set; }
 //  public string? OriginalRecord { get; set; }
}

This is my data file:

32,Foo
45,Bar

Reading is done like this

    using (var reader = new StreamReader("file.csv"))
    using (var csv = new CsvReader(streamReader, new CsvConfiguration(CultureInfo.InvariantCulture) { HasHeaderRecord = false }))
    {
        var records = csv.GetRecords<Data>();
    }

Now, my question is this: is there anyway that I can populate the OriginalRecord property with data used to create the record (32,Foo for the first record, and 45,Bar for the second record)?


Solution

  • You can use Convert in a ClassMap to get the RawRecord value.

    void Main()
    {
        using (var reader = new StringReader("32,Foo\n45,Bar"))
        using (var csv = new CsvReader(reader, new CsvConfiguration(CultureInfo.InvariantCulture) { HasHeaderRecord = false }))
        {      
            csv.Context.RegisterClassMap<DataMap>();
            var records = csv.GetRecords<Data>().Dump();
        }
    }
    
    public sealed class DataMap : ClassMap<Data>
    {
        public DataMap()
        {
            Map(x => x.Id).Index(0);
            Map(x => x.Name).Index(1);
            Map(x => x.OriginalRecord).Convert(args => args.Row.Parser.RawRecord);
        }
    }
    
    public class Data
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string? OriginalRecord { get; set; }
    }