供应商每晚向我们提供一个 csv 文件。我们需要获取该 csv,提取一些列,然后将它们导入我们的内部应用程序。我们收到的 csv 看起来有点像这样:
StudentId, GradYear, 2014 Thing1, 2014 Thing2, 2015 Thing1, 2015 Thing2
依此类推,似乎永久添加列。当我第一次看到这个 csv 时,我的第一个倾向是将它转换为 2 列:因此:
StudentId, 123456
GradYear, 2016
2014 Thing1, overdue
2015 Thing1, completed
我的倾向是使用 csvHelper 来读取这个文件,并通过构造一个 ILookup 来转置它。所以我会有一个看起来像这样的查找:
var theLookup = ILookup<string, KeyValuePair<string, string>>
键是 StudentId,而 KeyValuePair 是列标题:单元格值。我几乎可以使用字典来解决这个问题,并使用字典键的计数器,但我无法以 StudentId 作为键来跳转到查找。这是我构建字典的方式:
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;
}
}
我可以使用以下代码查看记录。我需要做这个 foreach 的一个版本来进行查找吗?或者,我应该只使用带有一些“如果它是'StudentId'那么让它成为关键吗?
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 + "'");
}
}
大多数情况下,我想知道我是否在正确的轨道上。当我最终得到任何供应商数据对象时,我将需要遍历它,将学生与我们的学生记录进行比较,并决定更新我们应用程序中的记录。