CsvHelperを使ったcsvファイル出力を汎用化できないかの試み


初めに

C#でcsvを扱うとき、Csvhelperというモジュールをよくつかうのですが、以下の記事を参考に出力についても汎用化できないかを試して見て一応できたので、備忘録として記事にします。
正直Genericsについてはあまり理解できていないので、もっといい書き方があるかも。。

参考記事:
CsvHelperでのcsv読み込みを、Genericsを使って汎用化
C# によるプログラミング入門 [オブジェクト指向] ジェネリック
CsvHelper

汎用化したつもりのコード

    public static class CSV出力クラス
    {
        public static void CSV出力<CMAP,T>(string f_Path,IEnumerable<T> 出力リスト)
            where CMAP : ClassMap
            where T: class
        {
            using (var csv = new CsvWriter(new StreamWriter(f_Path), CultureInfo.InvariantCulture))
            {
                csv.Configuration.HasHeaderRecord = false;
                csv.Configuration.RegisterClassMap<CMAP>();
                csv.WriteRecords(出力リスト);
            }
        }


    }

ClassMap(CMAP)とIEnumerableの型(T)を指定するとそれらに対応したCSVファイルを出力できる。
→出力したいCSVファイルのレイアウトが複数あっても、レイアウトごとの出力ロジックを書く必要がなくなる!!
引数は
 f_Path:(出力先のフォルダパスとファイル名を合わせたもの)
 出力リスト:CSVファイルにしたいリスト
上記を渡すだけ。

例えばこんな感じ

格納クラス

    public class SampleCsv
    {
        public int ID { get; set; }
        public string 項目1 { get; set; }
        public string 項目2 { get; set; }
        public string 項目3 { get; set; }
        public string 項目4 { get; set; }

    }

マッピングクラス

    public class SampleCSV_Mapping:ClassMap<SampleCsv>
    {
        private SampleCSV_Mapping()
        {
            Map(x => x.ID).Index(0);
            Map(x => x.項目1).Index(1);
            Map(x => x.項目2).Index(2);
            Map(x => x.項目3).Index(3);
            Map(x => x.項目4).Index(4);
        }
    }

出力処理

            string 出力フォルダ = @"C:\temp\test";
            string ファイル名 = "SampleCsv.csv";

            var 出力リスト = new List<SampleCsv>
            {
                new SampleCsv{ID = 1,項目1="a",項目2="aa",項目3="aaa",項目4="aaaa"},
                new SampleCsv{ID = 2,項目1="b",項目2="bb",項目3="bbb",項目4="bbbb"},
                new SampleCsv{ID = 3,項目1="c",項目2="cc",項目3="ccc",項目4="cccc"},

            };

            CSV出力クラス.CSV出力<SampleCSV_Mapping, SampleCsv>(Path.Combine(出力フォルダ, ファイル名), 出力リスト);

出力結果

※ダブルクォーテーションをつけたり、ヘッダーをつけたりすることも可能だがここではしない

まとめ

・CsvHelperを使ったcsvファイル出力機能の汎用化

感想

Genericsについてはまだ理解できたとは言えないのですが、
CsvHelperでのcsv読み込みを、Genericsを使って汎用化の記事を見て
出力するときもいけるんじゃね?と思ってやってみたらいけました。

そんなに出力するCSVのレイアウトが多くないのであれば汎用化する意味もそんなにないかもだけど、、
レイアウトが増えるたびに出力ロジック書くのも大変だなと思ったのでやってみました。