【C#】CSV出力を行う方法を徹底解説!

スポンサーリンク

C#でアプリケーションを開発していると、「データをCSVファイルとして出力したい」という場面によく遭遇します。例えば、データベースの内容をエクスポートしたり、レポート用のデータを生成したりする際に、CSVファイルは非常に便利です。

本記事では、C#を使ってCSVファイルを出力する方法を、基本的な実装からライブラリを活用した方法までわかりやすく解説します。初心者の方でも理解しやすいように、サンプルコードを交えながら説明していきますので、ぜひ参考にしてください!

CSV出力の基本実装

C#でCSVを出力するには、いくつかの方法があります。ここでは、基本的な方法としてStreamWriter を使った方法と、StringBuilder を使った方法を紹介します。

StreamWriterを使った方法

StreamWriter を使ってテキストファイルを作成し、CSV形式で書き込んでいく方法を紹介します。

以下が、Parson クラスを定義し、リストにデータを格納して、それをStreamWriter を使ってリストデータをCSVに出力するコードになります。

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

class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        // サンプルデータの作成
        List<Person> people = new List<Person>
        {
            new Person { Id = 1, Name = "田中 太郎", Age = 30 },
            new Person { Id = 2, Name = "山田 花子", Age = 25 },
            new Person { Id = 3, Name = "鈴木 一郎", Age = 40 }
        };

        // CSV出力処理
        string filePath = "people.csv";
        using (StreamWriter writer = new StreamWriter(filePath, false, Encoding.UTF8))
        {
            // ヘッダー行の書き込み
            writer.WriteLine("ID,名前,年齢");

            // データ行の書き込み
            foreach (var person in people)
            {
                writer.WriteLine($"{person.Id},{EscapeCsvValue(person.Name)},{person.Age}");
            }
        }

        Console.WriteLine("CSVファイルが作成されました!");
    }

    // 値にカンマや改行が含まれる場合のエスケープ処理
    static string EscapeCsvValue(string value)
    {
        if (value.Contains(",") || value.Contains("\"") || value.Contains("\n"))
        {
            return $"\"{value.Replace("\"", "\"\"")}\"";
        }
        return value;
    }
}

ポイント

  • StreamWriter を使ってファイルを作成し、データを書き込む
  • データ内にカンマや改行が含まれている場合を考慮してエスケープ処理を記述
  • Encoding.UTF8 を指定することで、文字化けを防ぐ

CSVの仕様では、カンマや改行を含む値は " で囲む必要があります。また、" 自体を含む場合は "" にエスケープしなければなりません。そのため、EscapeCsvValue() メソッドを定義し、適切に処理を行っています。

StringBuilderを使った方法

StringBuilder を使うと、文字列の連結処理が効率的になり、メモリ使用量を抑えることができます。

以下が、StringBuilder を使ってリストデータをCSVに出力するコードになります。

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

class Program
{
    static void Main()
    {
        // サンプルデータ
        List<string[]> data = new List<string[]>
        {
            new string[] { "ID", "名前", "年齢" },
            new string[] { "1", "田中 太郎", "30" },
            new string[] { "2", "山田 花子", "25" }
        };

        // StringBuilderを使用してCSVを作成
        StringBuilder csvContent = new StringBuilder();

        foreach (var row in data)
        {
            csvContent.AppendLine(string.Join(",", row));
        }

        // ファイルへ出力
        File.WriteAllText("output.csv", csvContent.ToString(), Encoding.UTF8);

        Console.WriteLine("CSVファイルが作成されました!");
    }
}

ポイント

  • StringBuilder を使うことで、繰り返しの文字列連結処理を効率化
  • AppendLine() を使って、改行を追加
  • File.WriteAllText() を使って、一気にファイルへ書き込み

この方法は StreamWriter を使う方法よりも処理が簡潔になり、パフォーマンスの面でも有利です。

CsvHelperライブラリを使った方法

前章では、StreamWriterStringBuilder を使ってCSVを出力する方法を紹介しました。しかし、「データが多い」「エスケープ処理を自動化したい」「もっと簡潔に書きたい」 という場合は、CsvHelper というライブラリを使うのがオススメです。

CsvHelper は、シンプルな記述でCSVの読み書きができる強力なライブラリ です。
データの自動マッピングやエンコーディング指定など、実用的な機能が充実しており、業務システムでもよく利用されています。ここでは、CsvHelperを使って、CSV出力を実装する手順をインストール方法から紹介します。

CsvHelperのインストール

まずは、CsvHelper をプロジェクトに追加しましょう。

NuGetパッケージマネージャーを使う場合

以下のコマンドを実行します。

dotnet add package CsvHelper

または、Visual Studio の 「NuGet パッケージ マネージャー」 から CsvHelper を検索してインストールすることもできます。

CsvHelperを使ったCSV出力の実装(推奨)

それでは、CsvHelper を使って オブジェクトのリストをCSVに書き出す方法 を紹介します。

実装例:CsvHelperを使ったCSV出力

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using CsvHelper;

class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        // サンプルデータ
        List<Person> people = new List<Person>
        {
            new Person { Id = 1, Name = "田中 太郎", Age = 30 },
            new Person { Id = 2, Name = "山田 花子", Age = 25 },
            new Person { Id = 3, Name = "鈴木 一郎", Age = 40 }
        };

        // CSV出力
        using (var writer = new StreamWriter("people.csv"))
        using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
        {
            csv.WriteRecords(people);
        }

        Console.WriteLine("CSVファイルが作成されました!(CsvHelper使用)");
    }
}

ポイント

CsvWriter.WriteRecords() で簡単にオブジェクトリストを出力

  • WriteRecords(people) で、List<Person> のデータを ヘッダー付きでCSVに自動変換 してくれます。
  • StreamWriter でファイルを開き、CsvWriter に渡して書き込みを実行します。

エスケープ処理が自動化

  • 文字列にカンマや改行が含まれていても、CsvHelper が自動的にエスケープ処理を行ってくれます。
  • そのため、手動で " のエスケープ処理を書く必要がありません!

エンコーディングの変更も簡単

  • StreamWriter("people.csv", false, Encoding.UTF8) のように変更すれば、UTF-8エンコーディングで出力できます。

CsvHelper を使うことで、少ないコードで安全にCSVを出力 できます。
特に、エスケープ処理やヘッダーの自動出力を考えると、StreamWriter よりも 手間がかからず、実装ミスを防ぎやすい です。

まとめ

本記事では、C#を使ってCSVファイルを出力する方法について、基本から応用まで詳しく解説しました。

C#でのCSV処理をマスターし、業務や開発に活かしていきましょう!

C#
スポンサーリンク

コメント