【C#】CSVファイルをカスタム定義型にマッピングする自作クラスを作成

C#

C#には標準でCSVファイルの読込みを行うクラスはありません。

ストリームから読み込んで自分で解析するか、ライブラリを使用する事になるかと思います。

案件によってはOSSライブラリの使用がNGだったりすることもあると思いますので、独自にCSVの読込み・出力を行うクラスを作成しましたので共有します。

リフレクションを使用していますので、処理速度は速くないですが、数千行程度であれば特に気になりません。(環境にもよりますが)

機能
  1. CSVの区切り文字を指定可能とする。
  2. ヘッダー行があってもなくても動作可能とする。
  3. 指定の型にマッピング出来るものとする。
  4. 指定の型をCSVに出力できるものとする。
  5. 値の前後の空白を取り除くかどうかを指定可能とする。
  6. 値を組み込み型に変換可能とする。

ソースコード

CsvParser.cs

CsvFileAttribute.cs

使用方法

CSVファイルの読込み

以下のCSVファイル読込みを例として解説します。

ユーザー定義型(マッピングする型)を定義し、CSVのカラムに対応したプロパティを定義します。

定義した型に「CsvFileAttribute」属性を指定し、カラムのインデックスを指定します。

ここではCSVファイルのカラム順と同じ順番でプロパティを定義していますが、CsvField(n)がCSVファイルのカラム順と対応していれば順番は前後していてもOKです。

CSVの値は空の場合があるため、Null許容型(Nullable)として定義します。

上記CSVファイルを定義した型にマッピングするには以下の様に使用します。

CSVファイルの出力

CSVファイルの出力をするには以下の様に使用します。

オプション

おまけ

実行速度を計測してみました。

列数7で1万行の出力で0.4秒程となっています。
10万行で約3.5秒。

さすがに100万行は35秒と遅いですが、CSVファイルを100万行パースして使用する事はまずないと思いますので、通常の使用であれば特に問題ない処理速度だと思います。

動作環境
・CPU i7 7700K
・メモリ 16GB
・ストレージ SSD

C#プログラミング
凡人プログラマーのブログ

コメント