今回は、C#でCSVの読み込み、書き込みを行う方法についてご紹介します。
CSVファイルはデータのやり取りや保存などで広く利用されています。
C#には標準ライブラリや外部ライブラリを使ってCSVファイルを扱う方法が複数あり、用途やファイルの内容に応じて最適な手法を選択できます。
ここでは、代表的な方法として標準ライブラリとCsvHelperなどの専用ライブラリを使った実装例を中心に、注意点も含めてご紹介します。
StreamReader・StreamWriterを用いた方法
まずは標準ライブラリを使ったシンプルな読み書き方法です。
ファイル操作に慣れていない場合でも、StreamReaderやStreamWriterは使いやすいので、多くの環境で活用されています。
CSVを読み込む例
以下のコードでは、StreamReaderを用いてCSVファイルを1行ずつ読み込み、カンマで分割したデータを出力します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
using System; using System.IO; class Program { static void Main() { string filePath = "data.csv"; // ファイルが存在するかチェック if (!File.Exists(filePath)) { Console.WriteLine("ファイルが見つかりません。"); return; } using (var reader = new StreamReader(filePath)) { while (!reader.EndOfStream) { string line = reader.ReadLine(); // カンマで分割 string[] fields = line.Split(','); Console.WriteLine(string.Join(" | ", fields)); } } } } |
Name | Age | Country
Alice | 30 | USA
Bob | 25 | UK
このコードはカンマ区切りを想定しているため、フィールド内にカンマや改行が含まれる場合には正しく分割できない可能性があります。
こうしたシンプルなCSV以外を扱う場合は、後述する専用ライブラリを検討するとよいでしょう。
CSVに書き込む例
次に、StreamWriterを用いてCSVファイルに書き込む例です。
このサンプルでは、文字列の二次元配列をループ処理し、各行をカンマ区切りの文字列に連結して書き出しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using System; using System.IO; class Program { static void Main() { string filePath = "output.csv"; // 書き出すデータ(例として文字列の二次元配列) string[][] data = new string[][] { new string[] { "Name", "Age", "Country" }, new string[] { "Alice", "30", "USA" }, new string[] { "Bob", "25", "UK" } }; using (var writer = new StreamWriter(filePath)) { foreach (var row in data) { // カンマ区切りで文字列に変換 string line = string.Join(",", row); writer.WriteLine(line); } } Console.WriteLine("CSVファイルへの書き込みが完了しました。"); } } |
CSVファイルへの書き込みが完了しました。
このように、標準ライブラリのStreamReaderやStreamWriterを使うだけで、単純なCSV処理は十分に実装できます。
ただし、フィールド内に特殊文字(カンマや改行、引用符など)が含まれる場合は、専用ライブラリを使わないと正しく扱えない場合があります。
CsvHelperなどの専用ライブラリを活用する方法
CSVの規格は単純にカンマ区切りとは限らず、複雑な仕様に対応する必要があるケースも多く存在します。
CsvHelperは、フィールド内にカンマや改行が含まれる状況でも正しくパースできるなど、高機能で便利なライブラリです。
NuGetからインストールして利用するため、プロジェクトの依存関係やライセンスにも注意してください。
CsvHelperを用いた読み込み例
CsvHelperでは、データをマッピングするクラスを定義しておき、CSVからそのクラスのリストを読み込むことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
using System; using System.Globalization; using System.IO; using System.Linq; using CsvHelper; public class Person { public string Name { get; set; } public int Age { get; set; } public string Country { get; set; } } class Program { static void Main() { using (var reader = new StreamReader("data.csv")) using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)) { var records = csv.GetRecords<Person>().ToList(); foreach (var person in records) { Console.WriteLine($"{person.Name} - {person.Age} - {person.Country}"); } } } } |
Alice – 30 – USA
Bob – 25 – UK
このように、CsvHelperではヘッダとクラスのプロパティを自動的にマッピングして読み込めるため、コードの可読性が向上します。
CsvHelperを用いた書き込み例
CsvHelperは読み込みだけでなく、オブジェクトのリストをCSVファイルに書き出すことも可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
using System; using System.Globalization; using System.IO; using System.Collections.Generic; using CsvHelper; public class Person { public string Name { get; set; } public int Age { get; set; } public string Country { get; set; } } class Program { static void Main() { var people = new List<Person> { new Person { Name = "Alice", Age = 30, Country = "USA" }, new Person { Name = "Bob", Age = 25, Country = "UK" } }; using (var writer = new StreamWriter("output.csv")) using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture)) { csv.WriteRecords(people); } Console.WriteLine("CSVファイルへの書き込みが完了しました。"); } } |
CSVファイルへの書き込みが完了しました。
特殊文字や改行などの扱いもCsvHelperが自動的に処理してくれるため、複雑なCSVを扱う場合に非常に便利です。
その他の方法と注意点
上記以外にも、File.ReadAllLinesでCSVを一括読み込みし、LINQで操作する方法があります。
また、Microsoft.VisualBasic.FileIO.TextFieldParserを使うと、引用符を含むCSVにも対応できます。
ただし、これらを使用する場合でも以下の点を意識すると、CSV処理をより安定させられます。
- 文字エンコーディング:UTF-8以外のファイルなら適切に指定する
- 例外処理:ファイルが存在しない場合やフォーマットエラーに備えてtry-catchを活用
- 大規模ファイルへの配慮:巨大なCSVは一括読み込みがメモリを圧迫する可能性がある
- ライブラリの依存関係:外部ライブラリはプロジェクトの依存性やライセンスにも注意
これらの方法を踏まえて、扱うCSVファイルの規模や内容に合ったアプローチを選択すると効率的に実装できます。
まとめ
C#でCSVを扱う際は、シンプルな形式か複雑な形式かを判断し、適切な手法を選びましょう。
標準ライブラリのStreamReader・StreamWriterは学習コストが低く、CsvHelperは複雑なCSVにも柔軟に対応可能です。
エンコードや例外処理など、ファイル操作の基本的な注意点も忘れずに実装することをおすすめします。