C#でクラスデータをCSVファイルに出力する方法

テクノロジー

はじめに

C#を使ってクラスのデータをCSVファイルに出力する方法を紹介します。

データはクラスに保管することも多いと思います。クラスデータをそのままCSVに出力できれば汎用的で、活用の幅が広がると思います。

今回は、CsvHeaderプロパティがあれば、CSVのヘッダーとしてそのプロパティ値を使用する方法を示します。以下のサンプルプログラムを実行することで、クラスデータをCSVファイルに出力する機能を取得できます。

サンプルプログラム

以下に、C#でクラスデータをCSVファイルに出力するサンプルプログラムを示します。

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Reflection;

class Program
{
    static void Main()
    {
        // データの準備
        List<Person> people = new List<Person>
        {
            new Person { Id = 1, Name = "山田 太郎", Age = 25 },
            new Person { Id = 2, Name = "鈴木 次郎", Age = 30 },
            new Person { Id = 3, Name = "佐藤 三郎", Age = 22 }
        };

        // CSVファイルに出力
        WriteCSV("output.csv", people);
        Console.WriteLine("CSVファイルを出力しました。");
    }

    static void WriteCSV<T>(string fileName, List<T> data)
    {
        using (StreamWriter sw = new StreamWriter(fileName, false, Encoding.UTF8))
        {
            Type type = typeof(T);
            PropertyInfo[] properties = type.GetProperties();

            // ヘッダーを書き込む
            List<string> headers = new List<string>();
            foreach (PropertyInfo property in properties)
            {
                CsvHeaderAttribute headerAttribute = property.GetCustomAttribute<CsvHeaderAttribute>();
                headers.Add(headerAttribute != null ? headerAttribute.HeaderName : property.Name);
            }
            sw.WriteLine(string.Join(",", headers));

            // データを書き込む
            foreach (T item in data)
            {
                List<string> rowData = new List<string>();
                foreach (PropertyInfo property in properties)
                {
                    rowData.Add(property.GetValue(item).ToString());
                }
                sw.WriteLine(string.Join(",", rowData));
            }
        }
    }
}

class Person
{
    [CsvHeader("ID")]
    public int Id { get; set; }

    [CsvHeader("氏名")]
    public string Name { get; set; }

    [CsvHeader("年齢")]
    public int Age { get; set; }
}

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
class CsvHeaderAttribute : Attribute
{
    public string HeaderName { get; set; }

    public CsvHeaderAttribute(string headerName)
    {
        HeaderName = headerName;
    }
}

このサンプルプログラムでは、以下の手順でCSVファイルを出力しています。

  1. 必要な名前空間をインポートします。
  2. PersonクラスとCsvHeaderAttributeクラスを定義します。
  3. Mainメソッド内で、Personクラスのインスタンスを作成し、リストに追加します。
  4. WriteCSVメソッドを呼び出し、CSVファイル名とデータリストを渡します。
  5. WriteCSVメソッド内で、StreamWriterを使ってCSVファイルにデータを書き込みます。ヘッダー部分では、CsvHeaderAttributeが適用されたプロパティの場合、属性で指定されたヘッダー名を使用します。

このプログラムを実行すると、カレントディレクトリにoutput.csvという名前のCSVファイルが生成され、指定したデータが書き込まれます。

まとめ

この記事では、C#を使ってクラスデータをCSVファイルに出力する方法を紹介しました。

指定されたCsvHeaderプロパティがあれば、CSVのヘッダーとしてそのプロパティ値を使用する方法を示しました。

サンプルプログラムを参考に、独自のアプリケーションでCSVファイルを出力できるようになります。

さらなる機能追加やカスタマイズが必要な場合は、必要に応じてプログラムを修正してください。

コメント