膨張空間

開発日記を中心に、時々雑記を投稿します。よろしく

CsvHelperでダブルクォーテーション付きのCSV出力をする方法(Ver26)

CsvHelperのバージョンを26に上げたら仕様がだいぶ変わってはまったので備忘録として記録する

この記事で達成できること

  1. CsvHelper ver26でダブルクォーテーション付きのCSVが出力できる
  2. 日本語のヘッダーを出力できる

書き方

/// <summary>
/// ファイル書き込み
/// </summary>
/// <returns></returns>
public void Write(IEnumerable<TModel> WriteData)
{
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        //ダブルクォーテーション付きにする
        ShouldQuote = (context) => true,
    };
    using (var writer = new StreamWriter(FilePath))
    using (var csv = new CsvWriter(writer, config) )
    {
        csv.Context.RegisterClassMap<FooMap>();
        csv.WriteRecords(WriteData);
    }
}

Class FooMap
{
    Map(m => m.hoge1).Index(0).Name("ヘッダー1");
    Map(m => m.hoge2).Index(1).Name("ヘッダー2");
    Map(m => m.hoge3).Index(3).Name("ヘッダー3");
}

//出力
ヘッダー1,ヘッダー2,ヘッダー3
hoge1の値,hoge2の値,hoge3の値

説明

// ver15の書き方
csv.Configuration.ShouldQuote = (s, context) => true;

こういう書き方をしている記事は古いのでブラウザバックしてください。 version 15では有効でしたがversion26ではConfigurationがReadOnlyプロパティに更新されたため上記のようにCsvConfigurationのコンストラクタで設定する必要があります。 注意するべき罠はもう一つあってShouldQuote の引数が1つになっていました。 公式サイトに書き方が書いてなかった(私は見つけられなかった)のでだいぶ苦労しました。

日本語のヘッダーを出力するために.Nameプロパティを定義します。 個人的にMapperクラスを定義した方が好きなので、アノテーションではなくこちらで書いています。 Indexで列を指定しないと出力順が保証されないそうです。公式サイトをGoogle翻訳した文章で理解したことなので必要があるかは謎ですが、入れていても問題なかったのでお守りだと思って入れたままにしています。 この記事を閲覧している人には釈迦に説法になると思いますが、「FooMap」「m.hoge1」などは説明上の仮値です。使用するクラスに合わせて変更してください。