かずきのBlog@hatena

日本マイクロソフトに勤めています。このブログは個人ブログなので、ここに書いている内容は個人的な意見で会社の公式見解ではない点にご注意ください。好きなものは XAML と C# 。苦手なものは型の無い言語です。

C#でCSVを読み込もう CsvHelper編

CSVを読み込むのにMicrosoft.VisualBasicを参照するのってなんかな…という人向けに。

CsvHelperというライブラリを見つけました。サイトはこちら。

クラスにマップしてくれる(フィールド番号等を指定してとる方法もある)ので刺身タンポポなクラスへのマッピング作業が不要になります。

使い方はデータを入れるクラスを作って、マッピングルールを作る(なくても大丈夫)

// CSVのデータを格納するクラス
class Record
{
    public string Column1 { get; set; }
    public string Column2 { get; set; }
    public string Column3 { get; set; }
}

// 格納するルール
class CsvMapper : CsvHelper.Configuration.CsvClassMap<Record>
{
    public CsvMapper()
    {
        Map(x => x.Column1).Index(0);
        Map(x => x.Column2).Index(1);
        Map(x => x.Column3).Index(2);
    }
}

あとは、こんな感じで使えばOKです。

using(var r = new StreamReader("sample.csv", Encoding.GetEncoding("SHIFT_JIS")))
using(var csv = new CsvHelper.CsvReader(r))
{
    // ヘッダーはないCSV
    csv.Configuration.HasHeaderRecord = false;
    // 先ほど作ったマッピングルールを登録
    csv.Configuration.RegisterClassMap<CsvMapper>();
    // データを読み出し
    var records = csv.GetRecords<Record>();

    // 出力
    foreach (var record in records)
    {
        Console.WriteLine("{0}/{1}/{2}", record.Column1, record.Column2, record.Column3);
    }
}

出力結果などは以下の記事と同じです。