获取数据从csv到字典c#
本文关键字:字典 csv 数据 获取 | 更新日期: 2023-09-27 18:08:55
我需要从csv到字典获取数据,但当我尝试编译此代码时,我收到错误"具有相同键的项目已经添加。"怎么做呢?'
Dictionary<string, string> dic = new Dictionary<string, string>();
public void AddToDic()
{
string line = "";
using (StreamReader sr = new StreamReader(@"words.txt"))
{
while (sr.Peek() != -1)
{
line = line + sr.ReadLine();
string[] splitted = line.Split(' ');
dic.Add(splitted[0], splitted[1]); //ERROR An item with the same key has already been added.
}
}
}
//text in words.txt is like: "car auto" newline "water voda" etc...
由于您没有向我们显示您试图解析的文件的内容,我们只能猜测。以下是我的猜测(后面跟着一个解决方案):
- 文件的每一行包含两个字
- 第一个单词应该成为字典的关键字
- 文件可能多次包含相同的关键字
由于字典需要唯一的键,并且文件可以多次包含相同的键,因此每个键可以有多个值。所以一个更好的数据结构可能是:Dictionary<string, string[]>
.
您可以使用File.ReadLines
或File.ReadAllLines
读取文件的行,然后使用LINQ将其转换为字典:
Dictionary<string, string[]> result =
File.ReadLines("words.txt")
.Select(line => line.Split(' '))
.GroupBy(arr => arr[0])
.ToDictionary(gr => gr.Key,
gr => gr.Select(s => s[1]).ToArray());
解释:在读取一行之后,它被分成一个string[]
。结果按第一个单词分组,该单词将成为字典的关键字。每个组都是一个IEnumerable<string[]>
,并且每个数组中只有第二个值被选择到结果中。
BTW:如果你用ReadAllLines
代替ReadLines
,文件将被立即读取,然后在处理它之前将被关闭。ReadLines
逐行读取,并在处理过程中保持文件打开。
试试下面的检查:
if(!dic.ContainsKey(splitted[0])
dic.Add(splitted[0], splitted[1]);
字典的键必须是唯一的
if(!dic.ContainsKey(splitted[0]))
dic.Add(splitted[0], splitted[1]); //ERROR An item with the same key
将阻止错误发生,但可能不是您想要的行为。考虑如何处理重复的键(文件加载失败,只存储第一个看到的键,只存储最后一个看到的键,如果有冲突,在键名后面附加计数器)