C# で埋め込みカンマを含む CSV 列を分割する
CSV ファイルでは通常、カンマを使用して列を区切ります。ただし、一部の列自体にカンマが含まれている場合があり、CSV データを異なる文字列に分割するときに問題が発生する可能性があります。
質問:
CSV 行が指定された場合:
<code>2,1016,7/31/2008 14:22,Geoff Dalgas,6/5/2011 22:21,http://stackoverflow.com,"Corvallis, OR",7679,351,81,b437f461b3fd27387c5d8ab47a293d35,34</code>
この行を文字列の配列に分割して、「Corvallis, OR」のテキストが 1 つのフィールドに残るようにするにはどうすればよいですか?
解決策:
指定された正規表現は、すべてのカンマが引用符の外側または内側にある CSV データでのみ機能します。この問題を解決するには、Microsoft.VisualBasic.FileIO
名前空間で TextFieldParser
クラスを使用することを検討してください。このクラスは、引用符で囲まれたフィールドと引用符で囲まれていないフィールドがある区切りファイルを処理するように設計されています。
コード:
<code class="language-csharp">using Microsoft.VisualBasic.FileIO; // ... string csv = "2,1016,7/31/2008 14:22,Geoff Dalgas,6/5/2011 22:21,http://stackoverflow.com,\"Corvallis, OR\",7679,351,81,b437f461b3fd27387c5d8ab47a293d35,34"; using (TextFieldParser parser = new TextFieldParser(new StringReader(csv))) { parser.HasFieldsEnclosedInQuotes = true; parser.SetDelimiters(","); while (!parser.EndOfData) { string[] fields = parser.ReadFields(); foreach (string field in fields) { Console.WriteLine(field); } } }</code>
出力:
<code>2 1016 7/31/2008 14:22 Geoff Dalgas 6/5/2011 22:21 http://stackoverflow.com Corvallis, OR 7679 351 81 b437f461b3fd27387c5d8ab47a293d35 34</code>
注:
TextFieldParser
を使用する場合は、「参照の追加.NET」タブでMicrosoft.VisualBasic
への参照を追加する必要があります。 このコードでは、using
ステートメントも使用して、TextFieldParser
が正しく閉じられていることを確認します。
以上がC#に埋め込まれたコンマでCSV列を適切に分割するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。