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(出力リスト);
}
}
}
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のレイアウトが多くないのであれば汎用化する意味もそんなにないかもだけど、、
レイアウトが増えるたびに出力ロジック書くのも大変だなと思ったのでやってみました。
Author And Source
この問題について(CsvHelperを使ったcsvファイル出力を汎用化できないかの試み), 我々は、より多くの情報をここで見つけました https://qiita.com/GettyAo/items/c6102fa0dfa814f4d85c著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .