2

次のタイプのデータを含むCSVファイルがあります。

0,'VT,C',0,
0,'C,VT',0,
0,'VT,H',0,

そして私は次の出力を望んでいます

0
VT,C
0
0
C,VT
0
0
VT,H
0

したがって、文字列をコンマで分割しますが、引用符内のコンマは無視します。現在、私は次の正規表現を使用しています。

("(?:^|,)(\"(?:[^\"]+|\"\")*\"|[^,]*)"

ただし、これにより次の結果が得られます。

0
VT
C
0
0
C
VT
0
0
VT
H
0

これは、正規表現が引用符を正しく読み取っていないことを示しています。誰かが役立つかもしれないいくつかの変更を提案できますか?

4

4 に答える 4

1

通常、CSV解析に関しては、アプリケーションのコーディングに使用しているプログラミング言語に適した特定のライブラリを使用します。

とにかく、正規表現を使用して本当に緩い(!)構文解析を行う場合は、次のようなものを使用してみてください。

'(?<value>[^']*?)'

一重引用符の間にあるものと一致し、csvファイルが整形式であると仮定すると、フィールドを見逃すことはありません。もちろん、埋め込まれた引用符は受け入れませんが、簡単に仕事をこなすことができます。それは私が仕事を本当に速く終わらせる必要があるときに私が使うものです。それがあなたの問題の完全な解決策であると考えないでください...要件があなたが説明したものであり、入力が整形式である場合、それは特別な条件で機能します。

[編集]

私はあなたの質問をもう一度チェックしていて、引用符で囲まれていないフィールドも含めたいことに気づきました...その場合、私の表現はまったく機能しません。とにかく聞いてください...あなたがあなたの問題について真剣に考えるならば、あなたはそれが曖昧さなしに解決するのが非常に難しい何かであることに気付くでしょう。固定ルールが必要であり、引用符で囲まれたフィールドと引用符で囲まれていないフィールドを許可すると、パーサーは区切り文字/引用符として正当なコンマを見つけるのに苦労します。

このようなソリューションをモデル化する別の式は次のとおりです。

('[^']+'|[^,]+),?

引用符で囲まれたフィールドと引用符で囲まれていないフィールドの両方に一致します...とにかく、csvが厳密な条件に準拠していると想定する必要があるかどうかはわかりません。これは、私が知る限り、分割戦略よりもはるかに安全に機能します...すべての一致を収集matched_value + \r\nし、ターゲット文字列に出力する必要があります。

于 2012-08-03T13:53:14.060 に答える
0

この正規表現は、 「値」の前後に1桁あるという事実に基づいています。

Regex.Replace(input, @"(?:(?<=\d),|,(?=\d))", "\n");

RegexStormでテストできます

于 2012-08-03T14:01:01.777 に答える
0

必要に応じて、次の方法でファイルを読み取ることができました。

public List<string> SplitCSV(string input, List<string> line)
    {

        Regex csvSplit = new Regex("(([^,^\'])*(\'.*\')*([^,^\'])*)(,|$)", RegexOptions.Compiled);

        foreach (Match match in csvSplit.Matches(input))
        {
            line.Add(match.Value.TrimStart(','));
        }
        return line; 
    }

でもみんな助けてくれてありがとう。

于 2012-08-03T14:35:49.527 に答える
0
foreach(var m in Regex.Matches(s,"(('.*?')|[0-9])"))
于 2012-08-03T18:30:19.253 に答える