命名って難しい

変数、関数、クラスなどなど実装より命名に毎回悩むタイプの人間による技術や趣味についてのメモ。

業務でCsvHelperを使った感想

CsvHelperとは

.Net向けのCSV読み書きライブラリです。 公式ページ

前提

以下のようなツールの開発で使用しました。

  1. CSVから情報を取り込む

  2. CSVの情報からなんやかんやする

  3. なんやかんやしたCSVデータをDBに保存する

感想

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();
         }
     }  
}