CSV、TSVテキストを読み込みフィールドに分割するTextFieldParserクラス [C#]

.NET Frameworkには、カンマやタブ文字で区切られたテキストテキストを読み込むための便利なクラスが用意されています。
Microsoft.VisualBasic.FileIO名前空間にあるTextFieldParserクラスを使えば区切り文字で分割されたテキストを読み込むことができます。
ただし、TextFieldParserクラスの仕様として以下の制限があります。

  • 空の行が削除されてしまう
  • ダブルクオーテーションで囲んだフィールド内の空白や改行が削除されてしまう。

ですので、カンマやタブ文字で区切られたテキストを読み込むクラスライブラリを自作したいと思います。

文字区切りテキスト読み込みクラス

文字で区切られたテキストを読み込むクラスは、文字エンコーディング、区切り文字(カンマ「,」またはタブ文字「\t」)、ダブルクォートの有無を自動で判別して区切り文字で分割した値(フィールド)を読み込みます。
文字エンコーディングと区切り文字はプロパティで指定することも可能にします。
プロジェクト名、クラス名はVisual Basicのクラスと同じ「TextFieldParser」にします。

文字エンコーディングの自動判定

文字エンコーディングの判定にはReadJEncを使います。
ReadJEnc GitHub
ReadJEncへの参照はNugetで追加します。
ソリューションエクスプローラーのプロジェクトを右クリックすると表示されるコンテキストメニューの「Nuget パッケージの管理」をクリックします。

Nugetパッケージの管理

参照で「ReadJEnc」を入力します。

Nugetパッケージの管理でReadJEncを参照

「変更のプレビュー」ダイアログボックスが表示されたら「OK」ボタンをクリックします。

Nugetパッケージの管理でReadJEncを参照後の変更のプレビューダイアログボックス

ReadJEncへの参照が追加されます。

参照されたReadJEnc

ソースコード

文字区切りを読み込むクラスのプロジェクトには、TextFieldParserクラスの他に1行ずつテキストを読み込んでフィールドにパースするCharacterSeparatedValueReaderクラスと、解析時の例外をスローする際に使用するMalformedLineExceptionクラスを作成します。

TextFieldParserクラスのプロジェクト構成

TextFieldParser クラス

CharacterSeparatedValueReader クラス

MalformedLineException クラス

TextFieldParserのコーディングが終わったらビルドしてdllを作成しておきます。

TextFieldParserを使用したサンプルプログラム

作成したTextFieldParserのdllを使用してテキストファイルのデータを読み込むサンプルプログラムを作成します。

ユーザーインターフェース

ユーザーインターフェースは次のようなWindows フォームを作成します。

TextFieldParserクラス実行サンプルフォームデザイン

フォームにはファイル名を入力するテキストボックスと、ファイルを参照するボタンと、ファイルの読み込みを実行するボタンと、読み込んだデータを表示するデータグリッドビューを配置します。

ソースコード

「ファイル名」テキストボックスの右にある「…」ボタンをクリックした時のイベント処理でファイルを開くダイアログボックスを表示してファイルを参照できるようにします。「読込」ボタンがクリックされた時のイベントで指定されたファイル名のテキストファイルを読み込んで、フィールドをデータグリッドビューに設定(表示)します。

プログラムの実行

プロジェクトをビルドして実行します。
読込テストを行うテキストとして、次のようなデータを入力したテキストファイルを用意します。

ファイルを参照して「読込」ボタンをクリックします。

TextFieldParserクラス実行サンプルフォームデザイン

文字エンコーディング、区切り文字を自動判定して、データグリッドにデータが設定されました。

TextFieldParserクラス実行サンプルフォーム読込実行結果

データグリッド上では改行がわかりづらいですが、セルを選択してコピーすると

以上のようなデータが読み込めていることが確認できます。