17

このCSVファイルがあるとします:

NAME,ADDRESS,DATE
"Eko S. Wibowo", "Tamanan, Banguntapan, Bantul, DIY", "6/27/1979"

二重引用符を使用して囲まれた各トークンを配列に格納したいのですが、String split() 関数を使用する代わりにこれを行うのは安全ですか? 現在、RichTextBox にファイルをロードし、その Lines[] プロパティを使用して、各 Lines[] 要素に対してループを実行し、これを実行します。

string[] line = s.Split(',');

s は RichTextBox.Lines[] への参照です。そして、はっきりとわかるように、トークン内のカンマは、split() 関数を簡単に台無しにする可能性があります。だから、私が望むように3つのトークンで終わるのではなく、6つのトークンで終わった

どんな助けでも大歓迎です!

4

6 に答える 6

27

正規表現も使用できます:

string input = "\"Eko S. Wibowo\", \"Tamanan, Banguntapan, Bantul, DIY\", \"6/27/1979\"";
string pattern = @"""\s*,\s*""";

// input.Substring(1, input.Length - 2) removes the first and last " from the string
string[] tokens = System.Text.RegularExpressions.Regex.Split(
    input.Substring(1, input.Length - 2), pattern);

これにより、次のことが得られます。

Eko S. Wibowo
Tamanan, Banguntapan, Bantul, DIY
6/27/1979
于 2013-06-20T07:46:31.150 に答える
9

私は独自の方法でこれを行いました。"'文字の量を単純に数えます。
これを必要に応じて改善してください。

    public List<string> SplitCsvLine(string s) {
        int i;
        int a = 0;
        int count = 0;
        List<string> str = new List<string>();
        for (i = 0; i < s.Length; i++) {
            switch (s[i]) {
                case ',':
                    if ((count & 1) == 0) {
                        str.Add(s.Substring(a, i - a));
                        a = i + 1;
                    }
                    break;
                case '"':
                case '\'': count++; break;
            }
        }
        str.Add(s.Substring(a));
        return str;
    }
于 2013-06-20T07:32:06.440 に答える
2

あなたの質問に対する正確な答えではありませんが、既に作成されたライブラリを使用して CSV ファイルを操作しないのはなぜですか。良い例はLinqToCsvです。CSV は、さまざまな句読点で区切ることができます。さらに、ライブラリの作成者によってすでに対処されている落とし穴があります。名前行の処理、さまざまな日付形式の処理、行の C# オブジェクトへのマッピングなど。

于 2013-06-20T08:02:25.650 に答える