2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[C#覚え書き]CSVHelperを使って自作クラスにCSVファイルを読み込む

Last updated at Posted at 2021-02-18

背景

最近、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ファイル(記事用に適当な内容です)
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

少し幸せになれた気がする

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?