Edited at

CsvHelperを使ってCSV出力してみた

C#でCSV出力する処理を書こうと思ったのだが、

ちまちま書くのがなんかダサいなと思って探してみたのがCsvHelperというモジュール。


参考

https://webbibouroku.com/Blog/Article/csvhelper-write


http://blog.okazuki.jp/entry/2014/12/26/121954


使い方

基本的には上記サイトのようにNugetでインストールし、マッパーを作成すればいいのだが


参考サイトと違った点が一つ。

Mapperの継承元としてCsvClassMapとあるが、どうもこれが変わったっぽい。


ClassMapになってた。

なのでこんな感じになる。

データ格納用のクラス

public class Person

{
public string Name { get; set; }
public string Kana { get; set; }
public DateTime BirthDate { get; set; }
}

CSV用のマッパークラス

public class PersonMapper : CsvHelper.Configuration.ClassMap<Person>

{
public PersonMapper()
{
Map(x => x.Name).Index(0).Name("氏名");
Map(x => x.BirthDate).Index(1).Name("生年月日").TypeConverterOption("yyyy/MM/dd");
Map(x => x.Kana).Ignore();
}

どうやらバージョンアップで書き方が少し変わったみたいです。

Map(x => x.BirthDate).Index(1).Name("生年月日").TypeConverterOption("yyyy/MM/dd");

Map(x => x.BirthDate).Index(1).Name("生年月日").TypeConverterOption.Format("yyyy/MM/dd");

出力処理

using (var sw = new StreamWriter(filePath, true, Encoding.GetEncoding("SHIFT_JIS")))

using (var csv = new CsvHelper.CsvWriter(sw))
{
// ヘッダーあり
csv.Configuration.HasHeaderRecord = true;
// マッパーを登録
csv.Configuration.RegisterClassMap<PersonMapper>();
// データを読み出し
csv.WriteRecords(Personのリスト);
}

リストをまとめて出力できるのは便利ですな。