我有一个结构一致的csv文件。前两个字段包含位置和类别值。
位置+类别条目通常是唯一的。但是,如果它们是重复的,则第三个字段将包含集合中每行的不同值。因此field1 + field2 + field3将始终形成唯一键。
我想返回给定位置+类别对的字典对象列表,字典键为字符串组合字段1-3,字典值包含整行。
这是我到目前为止所做的,但我无法正常工作:
public static List<Dictionary> ItemEntries(string LocationAndCategory)
{
string fileOfLocations = @"C:\MyFile.csv"
return File.ReadAllLines(fileOfLocations).Where(line => line.Split(',')[0] + " " + line.Split(',')[1] == LocationAndCategory).Select(line => line.Split(',')).ToDictionary(data => data[0] + data[1] + data[2], data=> line);
}
答案 0 :(得分:2)
你可以试试这个:
//...
return (from line in File.ReadAllLines(fileOfLocations)
let columns=line.Split(',') // apply the Split just one time
where columns[0]+" "+ columns[1] == LocationAndCategory //apply your filter
group line by columns[0]+columns[1]+columns[2] into g //group the lines using the three columns to create a key
select new {Key=g.Key, Lines= g.ToList()}).ToDictionary(e=>e.Key, e=>e.Lines);
使用方法语法将是这样的:
return File.ReadAllLines(fileOfLocations).Select(l=> new {Line=l, Columns=l.Split(',')})
.Where(e=>e.Columns[0]+" "+e.Columns[1]==LocationAndCategory)
.GroupBy(e=>e.Columns[0]+e.Columns[1]+e.Columns[2], e=>e.Line)
.ToDictionary(g=>g.Key,g=>g.ToList() );
如果您的CSV的第一行以标题开头,则可以在调用Skip(1)
方法后致电ReadAllLines
。
也许这就是你真正想要的:
public static Dictionary<string,string> ItemEntries(string LocationAndCategory)
{
return File.ReadAllLines(fileOfLocations).Select(l=> new {Line=l, Columns=l.Split(',')})
.Where(e=>e.Columns[0]+" "+e.Columns[1]==LocationAndCategory)
.ToDictionary(e=>e.Columns[0]+e.Columns[1]+e.Columns[2],e=>e.Line);
}
PS:假设这三列的组合是唯一的,否则ToDictionary
将抛出异常。