かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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);
    }
}

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