Search code examples
c#csvcsvhelper

Read all values from CSV into a List using CsvHelper


So I've been reading that I shouldn't write my own CSV reader/writer, so I've been trying to use the CsvHelper library installed via nuget. The CSV file is a grey scale image, with the number of rows being the image height and the number columns the width. I would like to read the values row-wise into a single List<string> or List<byte>.

The code I have so far is:

using CsvHelper;

public static List<string> ReadInCSV(string absolutePath)
{
    IEnumerable<string> allValues;

    using (TextReader fileReader = File.OpenText(absolutePath))
    {
        var csv = new CsvReader(fileReader);
        csv.Configuration.HasHeaderRecord = false;
        allValues = csv.GetRecords<string>
    }

    return allValues.ToList<string>();
}

But allValues.ToList<string>() is throwing a:

CsvConfigurationException was unhandled by user code

An exception of type 'CsvHelper.Configuration.CsvConfigurationException' occurred in CsvHelper.dll but was not handled in user code

Additional information: Types that inherit IEnumerable cannot be auto mapped. Did you accidentally call GetRecord or WriteRecord which acts on a single record instead of calling GetRecords or WriteRecords which acts on a list of records?

GetRecords is probably expecting my own custom class, but I'm just wanting the values as some primitive type or string. Also, I suspect the entire row is being converted to a single string, instead of each value being a separate string.


Solution

  • According to @Marc L's post you can try this:

    public static List<string> ReadInCSV(string absolutePath) {
        List<string> result = new List<string>();
        string value;
        using (TextReader fileReader = File.OpenText(absolutePath)) {
            var csv = new CsvReader(fileReader);
            csv.Configuration.HasHeaderRecord = false;
            while (csv.Read()) {
               for(int i=0; csv.TryGetField<string>(i, out value); i++) {
                    result.Add(value);
                }
            }
        }
        return result;
    }