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のリスト);
}
リストをまとめて出力できるのは便利ですな。