从csv获取数据到字典c#

时间:2013-04-13 16:46:06

标签: c#

我需要从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...

3 个答案:

答案 0 :(得分:0)

尝试以下检查:

if(!dic.ContainsKey(splitted[0])
    dic.Add(splitted[0], splitted[1]);

答案 1 :(得分:0)

由于您没有向我们展示您尝试解析的文件的内容,我们只能猜测。以下是我的猜测(其次是解决方案):

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

由于字典需要唯一密钥,并且文件可能多次包含相同的密钥,因此每个密钥可以有多个值。因此,更好的数据结构可能是: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:如果您将ReadLines替换为ReadAllLines,则会立即读取该文件,然后在处理之前将其关闭。 ReadLines逐个读取这些行,并在处理过程中保持文件处于打开状态。

答案 2 :(得分:-1)

字典键必须是唯一的

if(!dic.ContainsKey(splitted[0]))
   dic.Add(splitted[0], splitted[1]);  //ERROR An item with the same key 

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