読者です 読者をやめる 読者になる 読者になる

Morning Girl

Windows, C#, .NET, Dynamics CRM etc..

【C#】【CsvHelper】CsvHelperによるマッピングクラスを利用したCSVファイルの取り込み

C# CsvHelper

前回CsvHelperを利用しつつも、マッピング用クラスは利用せずに取り込む方法を記載しました。

kageura.hatenadiary.jp

今回はマッピング用のインターフェース[CsvHelper.Configuration.CsvClassMap]を利用した形のCSVファイル取り込みを試します。

それではまず、今回は最初に実際に作成してみたコードを記載したいと思います。

取り込むCSVファイル

取り込む対象のCSVファイルは以下の様なものになります。

name,telephone1,address1_city,primarycontactid,numberofemployees
Account1,80323287,Tokyo,test contact,10
Account2,3487984728,Osaka,test contact,12
Account3,34923487,Nagoya,test contact,332
,,,,21

コード

using System;
using System.IO;
using System.Text;

namespace MyProject.CsvHelperHello
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var sr = new StreamReader("account.csv", UnicodeEncoding.Unicode))
            using (var csv = new CsvHelper.CsvReader(sr))
            {
                csv.Configuration.RegisterClassMap<AccountMapper>();

                var records = csv.GetRecords<Account>();
                
                foreach(var data in records)
                {
                    Console.WriteLine("{0} : {1} : {2} : {3}",data.Name, data.Telephone1,data.Address1_city,data.Primarycontactid);
                }

                Console.ReadKey();
            }
        }    
    }

    /// <summary>
    /// 格納用クラス
    /// </summary>
    public class Account
    {
        public string Name { get; set; }
        public string Telephone1 { get; set; }
        public string Address1_city { get; set; }
        public string Primarycontactid { get; set; }
        public string Numberofemloyees { get; set; }
    }

    /// <summary>
    /// マッピング用クラス
    /// </summary>
    class AccountMapper : CsvHelper.Configuration.CsvClassMap<Account>
    { 
        public AccountMapper()
        {
            Map(x => x.Name).Index(0);
            Map(x => x.Telephone1).Index(1);
            Map(x => x.Address1_city).Index(2);
            Map(x => x.Primarycontactid).Index(3);
            Map(x => x.Numberofemloyees).Index(4);
        }
    }
}

実行結果

f:id:sugimomoto:20150517160526p:plain

CsvHelper.Configuration.CsvClassMap

CsvHelperでは様々なマッピング方法を提供していますが、今回は列インデックスによる手法で作ってみました。

joshclose.github.io

まずマッピング用のクラスと格納用クラスを準備します。

マッピング用クラスはCsvHelper.Configuration.CsvClassMap<格納クラス>をオーバーライドさせて扱うもので、コンストラクタで各種マッピングを行います。

    /// <summary>
    /// マッピング用クラス
    /// </summary>
    class AccountMapper : CsvHelper.Configuration.CsvClassMap<Account>
    { 
        public AccountMapper()
        {
            Map(x => x.Name).Index(0);
            Map(x => x.Telephone1).Index(1);
            Map(x => x.Address1_city).Index(2);
            Map(x => x.Primarycontactid).Index(3);
            Map(x => x.Numberofemloyees).Index(4);
        }
    }

[Map(x => x.Name).Index(0);]のように、ラムダ式で格納クラスの情報を取り出し、Indexメソッドでどの列番号かを指定しています。

この部分はIndexでも可能ですし、Csvファイルのヘッダー名でも指定可能です。

このあたりがCsvHelperを利用した際、手軽に扱えて便利な点ですね。

その後、CsvReaderでCsvファイルを読み込んだ後、.Configuration.RegisterClassMap<マッピングクラス>()メソッドCsvファイルのマッピングを行っています。