2011-01-28 28 views
3

我有一個CSV字符串,我想將它分隔成一個數組。但是,CSV是字符串和數字的組合,其中的字符串用引號引起來,並且可能包含逗號。拆分CSV並在元素中排除逗號

例如,我可能有一個CSV如下:

1,"Hello",2,"World",3,"Hello, World" 

我想它因此字符串被分爲:

1 
"Hello" 
2 
"World" 
3 
"Hello, World" 

如果我使用String.Split(',');我得到:

1 
"Hello" 
2 
"World" 
3 
"Hello 
World" 

是否有這樣做的一個簡單的方法?一個已經編寫過的庫,還是我必須逐個字符地解析字符串?

回答

6

代碼項目的"A Fast CSV Reader"文章。我多次愉快地使用它。

+0

感謝完美。保存我寫一個解析器! – lancscoder 2011-01-28 15:48:48

2

String.Split()是噁心此。它不僅有像你剛剛發現的那種(和其他你還沒見過的)不兼容的惡劣角落案例,而且性能也不盡如人意。由他人發佈將工作FastCSVReader,有內置的框架(Microsoft.VisualBasic.TextFieldParser)一個體面的CSV解析器,我有一個簡單的解析器,行爲正確發佈到this question

+0

我已將C#代碼添加到Joel的答案中(點擊他的鏈接) – 2013-02-17 21:15:12

1

我會建議使用以下解決方案之一,只是在考驗他們幾個(因此延遲): - 未找到

  1. 正則表達式匹配逗號一個封閉的雙aprostophe
  2. A Fast CSV Reader內 - 爲閱讀CSV只有
  3. FileHelpers Library 2.0 - 讀/寫CSV

希望這有助於。

1

,如果你只想快速複製和粘貼代碼(避免不必導入DLL或其他代碼庫)這不是最好的解決方法,但最快:

private string[] splitQuoted(string line, char delimeter) 
    { 
     string[] array; 
     List<string> list = new List<string>(); 
     do 
     { 
      if (line.StartsWith("\"")) 
      { 
       line = line.Substring(1); 
       int idx = line.IndexOf("\""); 
       while (line.IndexOf("\"", idx) == line.IndexOf("\"\"", idx)) 
       { 
        idx = line.IndexOf("\"\"", idx) + 2; 
       } 
       idx = line.IndexOf("\"", idx); 
       list.Add(line.Substring(0, idx)); 
       line = line.Substring(idx + 2); 
      } 
      else 
      { 
       list.Add(line.Substring(0, Math.Max(line.IndexOf(delimeter), 0))); 
       line = line.Substring(line.IndexOf(delimeter) + 1); 
      } 
     } 
     while (line.IndexOf(delimeter) != -1); 
     list.Add(line); 
     array = new string[list.Count]; 
     list.CopyTo(array); 
     return array; 
    }