かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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

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