获取数据从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...

获取数据从csv到字典c#

由于您没有向我们显示您试图解析的文件的内容,我们只能猜测。以下是我的猜测(后面跟着一个解决方案):

  • 文件的每一行包含两个字
  • 第一个单词应该成为字典的关键字
  • 文件可能多次包含相同的关键字

由于字典需要唯一的键,并且文件可以多次包含相同的键,因此每个键可以有多个值。所以一个更好的数据结构可能是:Dictionary<string, string[]> .

您可以使用File.ReadLinesFile.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 

将阻止错误发生,但可能不是您想要的行为。考虑如何处理重复的键(文件加载失败,只存储第一个看到的键,只存储最后一个看到的键,如果有冲突,在键名后面附加计数器)