2011-11-13 105 views
0

可能重複:
CSV parser/reader for C#?拆分文本

我想用Split功能分割文本:

string str = "ZBEE10364,\"Cobler, CHARLOTTE J\",Whiskey,,Brandy,0:00:00,20110912,CHECK,2918,117.33,1,117.33,0,EDM0,Yu789"; 
string[] strArr = str.Split(','); 

這工作得很好,但"Cober"CHARLOTTE在不同的記錄。我不想那樣。這是一個CSV文件,當我用Excel打開它時,它完美地工作。

Cobler, CHARLOTTE J出現在一個列中。我該如何解決這個問題?

+7

如果它是一個CSV文件,使用一個適當的CSV解析器。 – BoltClock

+1

http://stackoverflow.com/questions/906841/csv-parser-reader-for-c – Vlad

+1

http://stackoverflow.com/questions/769621/dealing-with-commas-in-a-csv-file – Andreas

回答

1

這個helper方法的伎倆:

public static class StringSplitHelper{ 

    public static string[] SplitNonQuoted(this string str, char separator){ 
    if(string.IsNullOrEmpty(str)) return new string[]{}; 
    if(separator == '\"') throw new ArgumentException("Separator cannot be a quotation mark", "separator"); 
    List<string> fields = new List<string>(); 
    bool inQuotes = false; 
    StringBuilder sb = new StringBuilder(); 
    foreach(var c in str){ 
     if(c == '\"') 
     { 
      inQuotes = !inQuotes; 
     } 
     else if(c == separator){ 
      if(inQuotes) { 
       sb.Append(c); 
      } 
      else { 
       fields.Add(sb.ToString()); 
       sb.Clear(); 
      } 
     } 
     else{ 
      sb.Append(c); 
     } 
    } 
    return fields.ToArray(); 
    } 
} 

然後,而不是strArr = str.Split(',');, 做strArr = str.SplitNonQuoted(this string str, ',');

+0

@Jaggu,Hogan鏈接的帖子中的源代碼在解析CSV文件時具有更好的通用解決方案**。 (儘管它不允許你使用「Split」方法) – smartcaveman

3

因爲您想在引號之間的記錄中忽略,,唯一的方法是解析行。

用布爾值(如果在引號之間爲true)在字符串上循環,然後手動構建列表/數組,只在布爾值爲false時創建新項目。

由於安德烈亞斯指出在評論中有完整的源位於這樣一個問題:

Dealing with commas in a CSV file

+0

+1,鏈接 – smartcaveman

2

可能是矯枉過正,但OLE DB提供程序爲Jet還可以讀取CSV文件,也可以給你的每一列的正確類型的數據。在這個例子中使用question

如果你想手動解析它(這應該是可行的),你可以參考CSV上的維基百科article,它稍微詳述了這個語法。

0
using System; 
using System.Text; 
using Microsoft.VisualBasic.FileIO; //Microsoft.VisualBasic.dll 
using System.IO; 

public class Sample { 
    static void Main(){ 
     string str = "ZBEE10364,\"Cobler, CHARLOTTE J\",Whiskey,,Brandy,0:00:00,20110912,CHECK,2918,117.33,1,117.33,0,EDM0,Yu789"; 
     string[] strArr = str.Split(','); 
     var reader = new StringReader(str); 
     using(var csvReader = new TextFieldParser(reader)){ 
      csvReader.SetDelimiters(new string[] {","}); 
      csvReader.HasFieldsEnclosedInQuotes = true; 
      strArr = csvReader.ReadFields(); 
     } 

     //check print 
     foreach(var item in strArr){ 
      Console.WriteLine("\"{0}\"",item); 
     } 
    } 
} 

結果

"ZBEE10364" 
"Cobler, CHARLOTTE J" 
"Whiskey" 
"" 
"Brandy" 
"0:00:00" 
"20110912" 
"CHECK" 
"2918" 
"117.33" 
"1" 
"117.33" 
"0" 
"EDM0" 
"Yu789"