🐙
C#でDTOクラスのリストをCSV形式で出力する方法
よくある以下のようなDTOクラスを、リストにして全要素の各プロパティの値をCSV形式で出力する方法について。
class TestDTO
{
public int Id { get; set; }
public string Name { get; set; }
public string Remarks { get; set; }
public TestDTO(int id, string name, string remarks)
{
Id = id;
Name = name;
Remarks = remarks;
}
}
まずはリストにします。
List<TestDTO> testDTOList = new List<TestDTO>
{
new TestDTO(1, "なまえ1", "びこう1"),
new TestDTO(2, "なまえ2", "びこう2"),
new TestDTO(3, "なまえ3", "びこう3")
};
そしてCSV出力用のメソッドを用意。
ジェネリックメソッドにしておけば、別のDTOクラスのリストをCSV出力したい場合にも、同じメソッドで対応できます。
DTOクラスのプロパティ名の一覧や値の一覧は、TypeクラスのGetPropertiesメソッドを使えば取り出せます。
private static void OutputCSV<T>(List<T> items, string fileName)
{
if (items == null || items.Count == 0)
{
return;
}
// リストの先頭の要素からプロパティ名をすべて取り出し、カンマ区切りで連結する
string headerLine = string.Join(",", items[0].GetType().GetProperties().Select(p => p.Name));
// リストの全要素のプロパティの値をすべて取り出し、カンマ区切りで連結する
IEnumerable<string> dataLines = from item in items
let dataLine = string.Join(",", item.GetType().GetProperties().Select(p => p.GetValue(item)))
select dataLine;
// ヘッダー行とデータ行を連結
List<string> csvData = new List<string>()
{
headerLine,
};
csvData.AddRange(dataLines);
// CSV出力
using StreamWriter sw = new(@$"C:\test\{fileName}.csv", false, Encoding.UTF8);
csvData.ForEach(line =>
{
sw.WriteLine(line);
});
}
あとはこれを呼ぶだけです。
OutputCSV(testDTOList, "test");
OutputCSVメソッドを実行すれば以下のようなCSVファイルが出力されます。
test.csv
Id,Name,Remarks
1,なまえ1,びこう1
2,なまえ2,びこう2
3,なまえ3,びこう3
Discussion