🐙

C#でDTOクラスのリストをCSV形式で出力する方法

2022/09/19に公開

よくある以下のような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