導入
CSVは業務データの定番形式ですが、string.Split(',')での自作パースは**「値の中にカンマや改行が入る」「ダブルクォート囲み」といった境界ケースであっさり壊れます(自作せず定番ライブラリに任せる発想)。CsvHelperはこれらを正しく処理し、CSVの各行をC#オブジェクトへ直接マッピング**します。
図解
flowchart LR
CSV["people.csv<br/>Name,Age<br/>Taro,20"] -->|GetRecords<Person>| OBJ["List<Person>"]
OBJ -->|WriteRecords| CSV2["出力CSV"]
進め方
- スターター
120-csvhelper/starter.zipを展開し、CsvLesson.slnを開く(CsvHelper導入済み・people.csv同梱) Program.csのTODO(読み込みと集計)を埋める- 期待される出力と照合する
学ぶこと
using System.Globalization;
using CsvHelper;
// 読み込み:ヘッダー名とプロパティ名が一致すれば自動マッピング
using var reader = new StreamReader("people.csv");
using var csv = new CsvReader(reader, CultureInfo.InvariantCulture);
List<Person> people = csv.GetRecords<Person>().ToList();
foreach (var p in people) Console.WriteLine($"{p.Name} ({p.Age})");
// 書き込み:オブジェクトの一覧をCSVへ
using var writer = new StreamWriter("out.csv");
using var w = new CsvWriter(writer, CultureInfo.InvariantCulture);
w.WriteRecords(people);
record Person(string Name, int Age);
GetRecords<T>()でCSV→オブジェクト一覧、WriteRecords()でオブジェクト一覧→CSV- カンマ入りの値・クォート・改行を仕様どおり正しく扱う(自作パースの弱点をカバー)
CultureInfoで数値・日付の書式を明示できる(地域差の事故を防ぐ)- ヘッダー名とプロパティ名が違う場合は
ClassMapで対応づけできる
期待される出力
Taro (20)
Hanako (25)
平均年齢: 22.5
まとめ
- CsvHelperはCSVとオブジェクトを
GetRecords/WriteRecordsで相互変換する - 自作
Splitが壊れる境界ケース(クォート・改行)を正しく処理する - 読み込んだ後はLINQでそのまま集計できる
次回: 単体テストで依存を差し替えるMoqです。
テンプレート構成(教材制作用メモ)
120-csvhelper/
├── starter.zip # CsvHelper導入済み / people.csv / Program.cs(TODO入り)
└── solution/Program.cs