2011-01-28 8 views
3

私は配列に分割したいCSV文字列を持っています。ただし、CSVは文字列が引用符で囲まれたコンマを含む文字列と数字の組み合わせです。CSVの分割と要素内のコンマの除外

は、例えば以下のように、私はCSVがある可能性があります:

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

文字列がに分割されるので、私はそれをしたいと思います:私はString.Split(',');を使用している場合

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

私が取得:

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

これを行う簡単な方法はありますか?既に書かれているライブラリか文字列ごとに文字列を解析する必要がありますか?

答えて

6

"A Fast CSV Reader"コードプロジェクトに関する記事。私はそれを何度も喜んで使ってきました。

+0

おかげで完全に働きました。パーサを書くのを救う! – lancscoder

2

この場合、String.Split()は不快です。あなたが見つけたもの(そしてあなたがまだ見ていないもの)のように動作しない厄介なコーナーケースを持つだけでなく、パフォーマンスも理想的ではありません。他の人が投稿したFastCSVReaderが動作し、フレームワーク(Microsoft.VisualBasic.TextFieldParser)に適切なcsvパーサーが組み込まれていて、正しく動作する単純なパーサーがthis questionにあります。

+0

私はJoelの答えにC#コードを追加しました(彼のリンクをクリックしてください) –

1

私は(それゆえ、遅延)それらのいくつかテストしていた、次のソリューションのいずれかを使用することをお勧めします: -

  • A Fast CSV Reader囲む二重aprostophe内

    1. 正規表現に一致する、カンマが見つかりません - のためにCSVにのみ
    2. 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; 
        } 
    
    関連する問題