2.0で追加されたTextFieldParserクラスを活用すると便利だ。C#およびVB.NETでの使い方を解説する。});連載目次CSVファイル(コンマ区切りのファイル)を読み込む処理は、フィールド自体にコンマが含まれていたり、フィールドがダブルクオーテーションで囲まれていたりする場合などがあり、結構面倒な作業である*。CSVファイルの仕様については以前は明確なものがなかったが、現在ではRFC4180により標準化されている。2005用の機能として、CSVファイルを読み込み、解析を行ってくれる非常に便利なTextFieldParserクラス(Microsoft.VisualBasic.FileIO名前空間)が追加されている。このクラスを使えば、CSVを読み込んで各行の各フィールドの文字列を簡単に取り出すことができる。このTextFieldParserクラスはC#からも利用可能だ。本稿ではこのクラスを使ってCSVファイルを読み込むための方法について解説する。TextFieldParserクラスによるCSVファイルの読み込みTextFieldParserクラスを使用してCSVファイルを読み込むには、まず処理したいCSVファイルをコンストラクタで指定してインスタンスを作成する。CSVファイルに日本語が含まれている場合には、ここでエンコーディングも指定可能だ(以降のコード例は上がC#、下がVBの場合)。_System.Text.Encoding.GetEncoding("Shift_JIS"))TextFieldParserクラスのコンストラクタ呼び出し次にTextFieldTypeプロパティにFieldType.Delimitedを設定する(FieldType.FixedWidthを指定すればフィールドが固定幅のファイルも扱うことができる)。SetDelimitersメソッドを呼び出して区切り文字を設定しておく(複数の区切り文字が指定可能)。CSVファイルの場合にはもちろんコンマを指定する。区切り文字はコンマフィールドがコンマで区切られている場合の設定あとはReadFieldsメソッドを呼び出すごとに、CSVファイルを1行ずつ読むことができる。このメソッドは、読み込んだ行の全フィールドを文字列の配列として返す。読み込むべき行がまだ残っているかどうかはEndOfDataプロパティにより判定できるので、次のようなループによりCSVファイル全体を処理できる。WhileCSVファイル全体を読み込みながら処理するループCSVファイルを読み込み、表示するサンプル・プログラム次に示すサンプル・プログラムは、CSVファイルであるtext.csvを読み込み、各フィールドを切り出してTAB区切りで画面に出力する。このプログラムでは、改行文字や空白文字がどのように処理されるかを分かりやすくするために、それぞれを「n」と「_」に置き換えて出力する。csvparser.vbCSVファイルを読み込み、表示するVBのサンプル・プログラム(csvparser.vbcsvparser.vbのダウンロードこのサンプル・プログラムに次のような内容のCSVファイルを読み込ませた場合の出力を以下に示す。最後の行は2番目のフィールドの途中に改行が入っている。このCSVファイルを読み込ませた場合のプログラムの出力は次のようになる(実際には出力はTAB区切りとなるが、ここでは分かりやすいように表形式に整形している)。うううサンプル・プログラムの出力結果ダブルクオーテーションで囲まれているフィールドや、改行文字が含まれているフィールドも正しく処理されているのが分かる。デフォルトの設定では、フィールドの前後にある空白文字が自動的に削除されているのも分かる。■HasFieldsEnclosedInQuotesプロパティすべてのフィールドが単純にコンマで区切られているものとして処理したい場合には、HasFieldsEnclosedInQuotesプロパティをfalseに設定する(デフォルトはtrue)。以下の出力結果は、上記のサンプル・プログラムでこのプロパティをfalseに設定した場合のものである。"ううう"HasFieldsEnclosedInQuotes=falseの場合の出力結果この場合にはダブルクオーテーションは処理されないのでそのまま出力される。フィールドの途中に改行が入っているデータは2つの行として扱われることになる。■TrimWhiteSpaceプロパティフィールド前後の空白文字を削除したくない場合にはTrimWhiteSpaceプロパティをfalseに設定する(デフォルトはtrue)。上記のサンプル・プログラムでこのプロパティをfalseに設定した場合の出力結果を以下に示す(HasFieldsEnclosedInQuotesプロパティはtrueのまま)。うううTrimWhiteSpace=falseの場合の出力結果ダブルクオーテーションで囲まれていないフィールドは、区切り文字であるコンマ以外の文字がすべて出力されている。ダブルクオーテーションで囲まれているフィールドは、ダブルクオーテーション内のフィールドの前後の空白文字が削除されない。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。