CSV到字典,在c#中以列头作为键

  • 本文关键字:字典 CSV c# dictionary
  • 更新时间 :
  • 英文 :


我想将CSV读入字典,但是我看到的大多数示例都将第一列作为键。我希望字段名是键。

CSV文件:

Name,Type,Classification
file1.txt,text,Secondary
file2.txt,text,Primary

输出字典(我想要的):

dict = {
Name: [file1.txt, file2.txt],
Type: [text, text],
Classification: [Secondary, Primary]
}

我不确定是否可以扩展这个

private void LoadCSV()
{
var mydict = new Dictionary<string, List<string>>();
var lines = File.ReadAllLines(@"C:test.csv");
string[] columnHeaders = lines[0].Split(',');
foreach (string columnHeader in columnHeaders)
{
mydict[columnHeader] = new List<string>();
}
}

编辑:

这可能是我想要的,但可能不是很有效:

private void LoadCSV()
{
var mydict = new Dictionary<string, List<string>>();
var lines = File.ReadAllLines(@"C:test.csv");
string[] columnHeaders = lines[0].Split(',');
string[] allLines = lines.Skip(1).ToArray();
int count = 0;
foreach (string headerPart in columnHeaders)
{
var valuelist = new List<string>();
foreach (string line in allLines)
{
List<string> l = line.Split(',').ToList();
var element = l.ElementAt(count);
valuelist.Add(element);
}
mydict[headerPart] = valuelist;
count++;
}
}

作为您正在使用的命令式样式的另一种选择,这里有一种使用Linq执行此操作的方法:

var csvPath = @"C:test.csv";
var separator = ",";
var lines = File.ReadLines(csvPath);
var indexedKeys = lines
.First()
.Split(separator, StringSplitOptions.None)
.Select((k, i) => 
(
Index: i,
Key: k
));
var values = lines
.Skip(1)
.Select(l => l.Split(separator, StringSplitOptions.None))
.ToList();
var result = indexedKeys
.ToDictionary(
ik => ik.Key,
ik => values
.Select(v => v[ik.Index])
.ToList());

对于您的解决方案效率(在您的帖子中编辑下面的代码),经过基本分析,有两个潜在的改进:

File.ReadAllLines不必要地将整个文件放在内存中。用File.ReadLine解决了这个问题。

您不是在每行上应用一次.Split()方法,而是在有列的情况下应用多少次。要解决这个问题,您的变量allines应该已经包含分隔行。我建议的解决方案是这样做的,参见变量values

好的开始!现在有了列标题,就可以构建字典了。显然,您需要跟踪列号与列名的匹配

string[] columnHeaders = lines[0].Split(',');
// do this for each line in the file
string[] columnRows = lines.Split(',');
for (int n = 0; n++; n <= columnRows.Length)
{
mydict[columnHeaders[n]] = mydict[columnHeaders[n]].Add(columnRows[n]);
}

通过这种方式,您可以向List添加一个新值,该值是给定索引

Dictionary的值。

相关内容

  • 没有找到相关文章

最新更新