業務でCsvHelperを使った感想
CsvHelperとは
前提
以下のようなツールの開発で使用しました。
感想
CSVの取込処理の負担軽減
社内ライブラリ、CSVの行をテキストで取った前提で、それをパーズしてインデックスでアクセスするようなクラスしかないんで…
単純にこれを使うだけでも恐ろしい負担軽減になりました。
CSVレコードからオブジェクトへのマッピングが容易にできる
前述の通り、社内ライブラリが貧弱なので行単位でテキストをオブジェクトにするため、
文字列からキャストやらパーズやら・・・という事をしていました。
CsvHelperはマッピングの設定を行うだけで、CSVからそのオブジェクトのリストに変換してくれます。
列名がオブジェクトのプロパティ名と同様であれば、マッピングも必要なかったかと思います。
今回はCSVに重複レコードがあったりもしたので、列のインデックスでマッピングを設定できる所に助かりました。
Dapperとの相性もよし!
サンプルコード
// こんな感じでマッピングをクラスで定義する。 public class MyCsvMapper : CsvHelper.Configuration.CsvClassMap<MyCsvRecord> { public MyCsvMapper() { // こんな感じでマッピングを追加していく。 Map(o => o.ItemName).Name("商品名"); Map(o => o.Price).Index(2); } } // CSV読み込みクラス public class CsvReader { public void Read() { using(var sr = new StreamReader(@"ファイルのパス", Encoding.GetEncoding("SHIFT_JIS"))) using(var csv = new CsvHelper.CsvReader(sr)) { csv.Configuration.HasHeaderRecord = true; csv.Configuration.RegisterClassMap<MyCsvMapper>(); var csvRecords = csv.GetRecords<MyCsvRecord>().ToList(); } } }