CSV file transposed to ILookup

210 Views Asked by At

A vendor is providing us a csv file nightly. We need to take that csv, pull out some of the columns, then import them into our in-house application. The csv, as we receive it, looks a bit like this:

StudentId, GradYear, 2014 Thing1, 2014 Thing2, 2015 Thing1, 2015 Thing2

and so on, adding columns seemingly to perpetuity. When I first saw this csv, my first inclination was to transpose it to 2 columns: thus:

StudentId, 123456
GradYear, 2016
2014 Thing1, overdue
2015 Thing1, completed

My inclination is use csvHelper to read this file in, and transpose it by constructing an ILookup. So I would have a Lookup that would look like:

var theLookup = ILookup<string, KeyValuePair<string, string>>

The key being the StudentId, and the KeyValuePair being the column header : cell value. I can almost work it out using a Dictionary, with a counter for the dictionary key, but I can't make the leap to Lookup with the StudentId as the key. Here is how I'm constructing the Dictionary:

Dictionary<int, List<KeyValuePair<string, string>>> vendorDictionary = new     Dictionary<int, List<KeyValuePair<string, string>>>();

using (var fileReader = File.OpenText(sourcePath))
using (var reader = new CsvHelper.CsvReader(fileReader))
{
     while (reader.Read())
    {
        var dynamicVendor = reader.GetRecord<dynamic>() as IDictionary<string, object>;

        foreach (var rec in dynamicVendor)
        {
            var recordDictionary = dynamicVendor.ToDictionary(k => k.Key, k => k.Value.ToString());
            vendorDictionary.Add(counter, recordDictionary.ToList());
            ++counter;
        }
    }

I can view the records with the following code. Do I need to do a version of this foreach to make into a Lookup? Or, should I just use a Dictionary with some "if it's 'StudentId' then make it the key?

foreach (var rec in vendorDictionary)
{
    Console.WriteLine("Vendor Dictionary record # " + rec.Key + " values are:");
    foreach (var value in rec.Value)
    {
       Console.WriteLine("Key: '" + value.Key + "' Value: '" + value.Value + "'");
    }                        
}

Mostly I want to know if I'm even on the right track here. When I have whatever object of vendor data I end up with, I will need to loop through it, compare student with our student record and make decisions about updating records in our app.

0

There are 0 best solutions below