Search code examples
c#csvhelper

csvhelper IsHeaderCaseSensitive Work around


I'm trying to read in a csv file with a Header 'EMAIL', however, I keep getting the CsvMissingFieldException thrown "Fields 'Email' do not exist in the CSV file".

I set up the CSVreader to handle-

csvReader.Configuration.IsHeaderCaseSensitive = false;

but I'm still getting the same issue. Does anyone know a work around? Or why the configuration isn't working?

In my Utilities class:

public static IEnumerable<T> CSVreader<T>(string fileName)
        {
            using (var fileReader = File.OpenText(fileName))
            using (var csvReader = new CsvHelper.CsvReader(fileReader))
            { 
                csvReader.Configuration.IsHeaderCaseSensitive = false;
                csvReader.Configuration.RegisterClassMap<OptOutClassMap>();

                while (csvReader.Read())
                {
                    var record = csvReader.GetRecord<T>();
                    yield return record;
                }
            }
        }

In my Class Map Class:

public string Email { get; set; }

public class CustomClassMap : CsvHelper.Configuration.CsvClassMap<CustomMap>
    {
        public override void CreateMap()
        {
            Map(m => m.Email);  
        }

    }

Solution

  • It looks like you are not using the correct ClassMap. From your code above, the line:

    csvReader.Configuration.RegisterClassMap<OptOutClassMap>();
    

    should be:

    csvReader.Configuration.RegisterClassMap<CustomClassMap>();
    

    Your code when modified works as expected.

    static void Main(string[] args)
    {
        var records = CSVreader<Record>("TextFile1.csv");            
    }
    
    public class Record
    {
        public string Email { get; set; }
    }
    
    public class CustomClassMap : CsvHelper.Configuration.CsvClassMap<Record>
    {
        public override void CreateMap()
        {
            Map(m => m.Email);
        }
    
    }
    
    public static IEnumerable<T> CSVreader<T>(string fileName)
    {
        using (var fileReader = File.OpenText(fileName))
        using (var csvReader = new CsvHelper.CsvReader(fileReader))
        { 
            csvReader.Configuration.IsHeaderCaseSensitive = false;
            csvReader.Configuration.RegisterClassMap<CustomClassMap>();
    
            while (csvReader.Read())
            {
                var record = csvReader.GetRecord<T>();
                yield return record;
            }
        }
    }