背景
最近、2つのCSVファイルを読み込んでJOINしてから解析することがあった
以前までは、DataTableに読み込んで解析していたが、最近は自作クラス+Linqの便利さを知ってしまったため、CSVを自作クラスのリストに落とし込めないかと探すとCSVHelperにたどり着いた
CSVHeplerはドキュメントも充実していて安心
https://joshclose.github.io/CsvHelper/
Shift-jis対応するのに参考したページ(ありがとうございます)
http://akira-arets.blogspot.com/2017/09/dotnetcore2-csvhelper-shiftjis.html
開発環境:VS2019 C#
事前準備(NuGetパッケージ)
- プロジェクトにNuGetパッケージマネージャーで
CSVHelper
を検索しインストール - Shift-jisに対応させるために
System.Text.Encoding.CodePages
も検索しインストール
自作クラス
- 読み込むCSVファイル(記事用に適当な内容です)
番号,名前,日付
1,Aさん,2020/12/28 14:44:00
2,Bさん,2020/12/28 14:29:00
3,Cさん,2020/12/28 16:03:00
4,Dさん,2020/12/28 15:23:00
CSVファイルに適応するClassとMapを作る
ClassとMapをCSVファイルの種類の数作る
今回は上記のCSVに対応させたOriginalクラスを作成しておく
public class Original
{
public int No { get; set; }
public string Name { get; set; }
public DateTime ReceptDate { get; set; }
}
public class OriginalMap : ClassMap<Original>
{
public OriginalMap()
{
Map(m => m.No).Name("番号");//CSVファイルのヘッダーの文字にすること
Map(m => m.Name).Name("名前");
Map(m => m.ReceptDate).Name("日付");
}
}
実際にGetRecordsを使ってみる
using CsvHelper
using CsvHelper.Configuration
using System.Globalization
その他、StreamReader用のSystem.IO、IEnumerable用のSystem.Collections.Genericなど追加
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);//Encoding.GetEncoding("shift-jis")を使うため
using (var reader = new StreamReader(path, Encoding.GetEncoding("shift-jis")))//pathはファイルのパス、StreamのEncodingにShit-jis設定
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
csv.Context.RegisterClassMap<OriginalMap>();//ContextにMapを設定
IEnumerable<Original> records = csv.GetRecords<Original>();//GetRecordsでIEnumerable<Original>に読み込む
//List<Original> records = csv.GetRecords<Original>().ToList();//GetRecordsでList<Original>に読み込む
foreach (var record in records)
{
Console.WriteLine(record.No+ "," + record.ReceptDate.ToString());//ちゃんと読み込めているか確認してみる
}
}
結果
1,Aさん,2020/12/28 14:44:00
2,Bさん,2020/12/28 14:29:00
3,Cさん,2020/12/28 16:03:00
4,Dさん,2020/12/28 15:23:00
少し幸せになれた気がする