2013-04-13 112 views
0

我需要從csv獲取數據到字典,但是當我嘗試編譯此代碼時,我收到錯誤「已添加具有相同密鑰的項目。」怎麼做 ? `從csv獲取數據到字典c#

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... 

+0

這不會是一個編譯時錯誤,這將是一個運行時錯誤。這意味着在csv文件之前發生了splitted [0],並且您還將其作爲關鍵字。如果您可以向我們展示csv文件,我們將能夠爲您提供更多幫助。 –

+1

您的文件有一個重複的密鑰(例如'汽車汽車',然後某個地方它有汽車,'汽車手冊')。你想如何處理重複鍵? – keyboardP

+0

整個文件請:)(或只是一個顯示問題)。另外,因爲你在做字典並不意味着你需要的數據結構是一個字典;) –

回答

0

由於您沒有向我們展示您嘗試解析的文件的內容,我們只能猜測。這裏是我的猜測(後面跟一個解決方案):

  • 文件的每一行有兩個詞
  • 的第一個詞應該成爲一本字典的
  • 的文件可能包含相同關鍵字的多個關鍵times

由於字典需要唯一鍵並且文件可能多次包含相同的鍵,因此每個鍵可能有多個值。所以更好的數據結構可能是: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[]>,並且只有每個數組的第二個值被選入結果中。

順便說一句:如果您將ReadLines替換爲ReadAllLines,則該文件將被立即讀取,然後在處理該文件之前它將被關閉。 ReadLines逐行讀取這些行,並在處理該文件時保持該文件處於打開狀態。

0

嘗試以下檢查:

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

如果他容忍/允許重複鍵,那麼他選擇了錯誤的數據結構。 – David

-1

字典鍵必須是唯一的

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

將阻止發生的錯誤,但你想可能不是行爲。考慮如何處理重複密鑰(文件加載失敗,只存儲您看到的第一個密鑰,只存儲您看到的最新密鑰,如果發生衝突,則在密鑰名稱末尾附加一個計數器)

+3

對你的評論而不是創建新的答案會更好嗎?這導致重複的答案。請考慮一下。 – David