csvファイル形式でデータを書き込みたい。
C# で csv ファイル形式でデータを書き込む(保存する)方法はいくつかあります。
ここでは NuGet から無料でインストールできる「CsvHelper」というライブラリを使う方法を紹介します。
CsvHelper は csv ファイルの読み書きができるライブラリで、csv ファイルの読み書きに関連する多くの機能が含まれています。例えば、区切り文字の設定やヘッダーの設定、マッピング機能のサポートなどがあります。これらの機能をうまく活用することで csv ファイルの操作が柔軟に行えるようになります。
この記事では、2023年9月時点で最新バージョン(3.0.1)の「CsvHelper」を利用して、データをcsv ファイル形式で書き込む方法について紹介しています。
オススメの参考書
C#の使い方が丁寧に解説しており、「基礎からしっかりと学びたい」という初心者の方にオススメの一冊です。サンプルコードも記載してあり、各章の最後に復習問題があるので理解度を確認しながら読み進めることができます。新しい C# のバージョンにも対応している書籍です。
CsvHelperとは
CsvHelper は、csv ファイルの読み書きができるオープンソースの .NET ライブラリです。非常に高速かつ柔軟に csv ファイルを扱うことができます。
このライブラリは次のような特徴が挙げられます。
CsvHelperの特徴
- 商用利用可能なオープンソースライブラリである
- 柔軟にCSVファイルの読み取りができる
- CSVファイルをクラスへマッピングする機能がある
特徴として挙げているマッピング機能は、クラスのデータを csv の列フィールドへマップしたり、その逆に csv の列フィールドをクラスの各プロパティにマップしてくれます。マッピングを管理するクラスを定義することで、クラスのプロパティと csv ファイルの列の関連付けが簡単に行えます。
CsvHelperをインストールする
CsvHelper は NuGet からインストールする事が可能です。もちろん、前述している通り無料で利用ができます。
インストール手順は次の通りです。
Visual Studio の「ツール」 -> 「NuGet パッケージ マネージャー」 -> 「ソリューションの NuGet パッケージの管理」を選択します。
「参照」タブを選択して、検索欄に「CsvHelper」と入力します。検索結果に表示された「CsvHelper」を選択します。
チェックボックスにチェックを入れて、「インストール」ボタンをクリックします。
ここでは、2023年9月時点で最新の安定版である 「30.0.1」 をインストールしています。
CsvHelperの使い方
それではデータを CSV ファイル形式で保存する方法をサンプルを交えながら紹介をします。
CsvHelper は新機能の追加が継続的に行われているので更新頻度が高く、古いバージョンで紹介されているサンプルだと動作しないということがありますので、バージョンは気にしておいた方がいいです。
ここで紹介するサンプルは2023年9月時点で最新の安定版である「30.0.1」を使っています。
CSVファイルへ書き込む
csv ファイルへの書き込みに使うのは「WriteRecord」もしくは「WriteRecords」です。
- WriteRecord
コレクションに格納されたデータを1つずつ取り出しながら、csvファイル形式で書き込みます。foreach文で繰り返し処理を行うことになります。 - WriteRecords
コレクションに格納されたデータを一括でcsvファイル形式で書き込みます。
csv ファイルに書き込むデータが用意できているのであれば、WriteRecords
メソッドを使う方が簡単に実装できると思います。
WriteRecordを使ったサンプル
csvファイルに書き込むデータを格納するためのクラスを用意します。
ここでは4つのデータ(名前 / 年齢 / 生年月日 / 住所)を持つクラスを作成しました。
public class Person
{
public string Name { get; set; }
public uint Age { get; set; }
public DateTime DateOfBirth { get; set; }
public string Address { get; set; }
}
Person
クラスのインスタンスを生成し、データを格納します。その後、データを格納した Person オブジェクトを List に追加します。
var records = new List<Person>
{
new Person { Name = "田中", Age = 20, DateOfBirth = new DateTime(2003, 1,30), Address="東京" },
new Person { Name = "佐藤", Age = 27, DateOfBirth = new DateTime(1996, 8,15), Address="大阪" },
new Person { Name = "鈴木", Age = 35, DateOfBirth = new DateTime(1988, 9,23), Address="京都" },
};
1行目にヘッダーをカンマ区切りで書き込みます。書き込む行を更新するためにNextRecord
メソッドを使います。
foreach 文で List からデータを取り出して、CsvHelper のWriteRecord
メソッドで csvファイルへ書き込みます。NextRecord
メソッドで書き込む行を移動しながら書き込みを行います。
using (var writer = new StreamWriter("csvfile.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
// 1行目にヘッダーを書き込む
csv.WriteHeader<Person>();
csv.NextRecord();
// 2行目以降にデータを書き込む
foreach (var record in records)
{
csv.WriteRecord(record);
csv.NextRecord();
}
}
実行結果は次のようになります。
Name,Age,DateOfBirth,Address
田中,20,01/30/2003 00:00:00,東京
佐藤,27,08/15/1996 00:00:00,大阪
鈴木,35,09/23/1988 00:00:00,京都
WriteRecordsを使ったサンプル
csvファイルに書き込むデータを格納するためのクラスを用意します。
「WriteRecord を使ったサンプル」と同じように4つのデータ(名前 / 年齢 / 生年月日 / 住所)を持つクラスを使います。
public class Person
{
public string Name { get; set; }
public uint Age { get; set; }
public DateTime DateOfBirth { get; set; }
public string Address { get; set; }
}
Person
クラスのインスタンスを生成し、データを格納します。その後、データを格納した Person オブジェクトを List に追加します。
var records = new List<Person>
{
new Person { Name = "田中", Age = 20, DateOfBirth = new DateTime(2003, 1,30), Address="東京" },
new Person { Name = "佐藤", Age = 27, DateOfBirth = new DateTime(1996, 8,15), Address="大阪" },
new Person { Name = "鈴木", Age = 35, DateOfBirth = new DateTime(1988, 9,23), Address="京都" },
};
CsvHelper のWriteRecords
メソッドにPerson
クラスのデータが格納されたList
を引数で渡して、コレクションにあるデータをカンマ区切りで全て書き込みます。
using (var writer = new StreamWriter("csvfile.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
// 1行目にヘッダーを書き込む
csv.WriteHeader<Person>();
csv.NextRecord();
// 2行目以降にデータを書き込む
csv.WriteRecords(records);
}
実行結果は次のようになります。
Name,Age,DateOfBirth,Address
田中,20,01/30/2003 00:00:00,東京
佐藤,27,08/15/1996 00:00:00,大阪
鈴木,35,09/23/1988 00:00:00,京都
マッピングでCSVファイルへ書き込む
先ほど紹介したサンプルは、CsvHelper が自動でマッピングして csv ファイルを出力してくれました。
シンプルなコードで csv ファイルが出力できる一方、ヘッダー名がプロパティ名になっていたり、日付が英語表記になっていたりします。マッピング機能を利用することで、細かい部分を指定して csv ファイルへ書き込むことができます。
public class Person
{
public string Name { get; set; }
public uint Age { get; set; }
public DateTime DateOfBirth { get; set; }
public string Address { get; set; }
}
ClassMap<Person>
を継承したPersonMapper
というマッピングを管理するクラスを定義します。
クラスのコンストラクタでMap
メソッドに、ラムダ式を使ってプロパティを指定します。次にIndex
でプロパティの列番号を指定します。次にName
でプロパティと関連付けた列の名前を指定できます。
また、TypeConverterOption
プロパティのFormat
メソッドを使うことで出力するデータフォーマットが指定できます。
public class PersonMapper : ClassMap<Person>
{
public PersonMapper()
{
Map(x => x.Name).Index(0).Name("氏名");
Map(x => x.Age).Index(1).Name("年齢").TypeConverterOption.Format("");
Map(x => x.DateOfBirth).Index(2).Name("生年月日").TypeConverterOption.Format("yyyy年MM月dd日");
Map(x => x.Address).Index(3).Name("住所");
}
}
Context
プロパティのRegisterClassMap
メソッドに定義したマッピング管理用クラスを設定します。
その後にWriteRecords
メソッドにPerson
クラスのデータが格納されたList
を引数で渡します。
using (var writer = new StreamWriter("csvfile.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
csv.Context.RegisterClassMap<PersonMapper>();
csv.WriteRecords(records);
}
実行結果は次のようになります。
氏名,年齢,生年月日,住所
田中,020,2003年01月30日,東京
佐藤,027,1996年08月15日,大阪
鈴木,035,1988年09月23日,京都
まとめ
この記事では CsvHelper を使って csv ファイルへ書き込む方法について紹介しました。
CsvHelper には書き込み用メソッドが2つあります。
- WriteRecord
コレクションに格納されたデータを1つずつ取り出しながら、csvファイル形式で書き込みます。foreach文で繰り返し処理を行うことになります。 - WriteRecords
コレクションに格納されたデータを一括でcsvファイル形式で書き込みます。
また、マッピング機能を活用することで、クラスのプロパティと csv ファイルの列の関連付けが簡単に行えます。Configurationクラスのプロパティでは区切り文字やヘッダーの設定が可能です。
csv ファイルの読み書きが柔軟に行える CsvHelperを使ってみてはいかがでしょうか。
以上、最後まで読んで頂きありがとうございました。