2011-11-13 32 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パーサー。 – 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

このヘルパーメソッドトリックん:それはCSVファイル、使用なら次に

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

はやり過ぎかもしれませんが、JETのためのOLE DBプロバイダは、CSVファイルを読み込むことができ、また与えることができます各列の適切なタイプのデータ。このquestionでの使用例

手動で解析するには、構文を詳細に説明するCSVのWikipedia 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); 
     } 
    } 
} 

RESULT

"ZBEE10364" 
"Cobler, CHARLOTTE J" 
"Whiskey" 
"" 
"Brandy" 
"0:00:00" 
"20110912" 
"CHECK" 
"2918" 
"117.33" 
"1" 
"117.33" 
"0" 
"EDM0" 
"Yu789" 
関連する問題