-2

正規表現の作成にはほとんど問題がありません。予想される入力:

blahblahblah, blahblahblah, 'blahblahblah', "blahblahblah, asdfd"

コンマで区切られた単語を配列にする必要があります。ただし、文字列にもカンマが発生する可能性があるため、分割機能は使用できません。したがって、期待される出力は次のとおりです。

arr[0] = blahblahblah
arr[1] = blahblahblah
arr[2] = 'blahblahblah'
arr[3] = "blahblahblah, asdfd"

正規表現や、私を助けて同様の出力を与えることができる別のソリューションを知っている人はいますか? 助けてください。

4

4 に答える 4

0

独自の CSV パーサーを展開する代わりに、.NET Framework に同梱されている標準のすぐに使える TextFieldParser クラスの使用を検討してください。

または、Microsoft Aceと OleDbDataReader を使用して、ADO.NET 経由でファイルを直接読み取ります。サンプルは、このような他の多くの投稿で見つけることができます。そして、サンプルとして使用できるCodeProject に関するこの古い投稿があります。Jet.OLEDB.4.0古いドライバーではなく、最新の Ace ドライバーを参照していることを確認してください。

これらのオプションは、長期的には、独自に構築されたファイル パーサーよりもはるかに簡単に維持できます。また、十分に文書化されていない CSV 形式を取り巻く多くのまれなケースを処理する方法を既に知っています。

于 2012-04-04T23:00:20.567 に答える
0

考えられるアプローチの 1 つは、( string.SplitRegEx ではなく を使用して) コンマで分割し、結果を反復処理することです。0 または 2'または"文字を含む結果ごとに、それを新しいリストに追加します。結果に 1'またはが含まれる場合、結果が 2またはに"なるまで後続の項目を再結合 (カンマを追加)し、それを新しいリストに追加します。'"

于 2012-04-04T16:58:23.330 に答える
0

問題が限られている場合、このようなことを行うことができます。正規表現は短く、おそらくより単純です。

string line = <YourLine>
var result = new StringBuilder();
var inQuotes = false;

foreach(char c in line)
{
    switch (c)
    {
        case '"':
            result.Append()
            inQuotes = !inQuotes;
            break;

        case ',':
            if (!inQuotes)
            {
                yield return result.ToString();
                result.Clear();
            }

        default:
            result.Append()
            break;                
    }
}
于 2012-04-04T17:13:37.813 に答える
0

これが最適かどうかはわかりませんが、http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester のテスト ケースから正しい出力が得られました。アッシュ:

(?>"[^"]*")|(?>'[^']*')|(?>[^,\s]+)

C# 文字列バージョン:

@"(?>""[^""]*"")|(?>'[^']*')|(?>[^,\s]+)"
于 2012-04-04T16:54:35.520 に答える