【C#】【CsvHelper】CsvHelperによるマッピングクラスを利用したCSVファイルの取り込み
前回CsvHelperを利用しつつも、マッピング用クラスは利用せずに取り込む方法を記載しました。
今回はマッピング用のインターフェース[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); } } }
実行結果
CsvHelper.Configuration.CsvClassMap
CsvHelperでは様々なマッピング方法を提供していますが、今回は列インデックスによる手法で作ってみました。
まずマッピング用のクラスと格納用クラスを準備します。
マッピング用クラスは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ファイルのマッピングを行っています。