本文へスキップ
BecomeCoder

C#実践コース · 第6章 代表的なNuGetパッケージとその使い方 · レッスン36

CsvHelper ― CSVの安全な読み書き(ローカル実施)

ローカル実施

導入

CSVは業務データの定番形式ですが、string.Split(',')での自作パースは**「値の中にカンマや改行が入る」「ダブルクォート囲み」といった境界ケースであっさり壊れます(自作せず定番ライブラリに任せる発想)。CsvHelperはこれらを正しく処理し、CSVの各行をC#オブジェクトへ直接マッピング**します。

図解

flowchart LR
    CSV["people.csv<br/>Name,Age<br/>Taro,20"] -->|GetRecords&lt;Person&gt;| OBJ["List&lt;Person&gt;"]
    OBJ -->|WriteRecords| CSV2["出力CSV"]

進め方

  1. スターター120-csvhelper/starter.zipを展開し、CsvLesson.slnを開く(CsvHelper導入済み・people.csv同梱)
  2. Program.csのTODO(読み込みと集計)を埋める
  3. 期待される出力と照合する
Visual StudioでCsvHelperを実行し、people.csvが読み込まれてPersonオブジェクトの一覧としてコンソールに表示された様子
ヘッダー名とプロパティ名が一致すれば、各行がそのままオブジェクトになる

学ぶこと

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