読者です 読者をやめる 読者になる 読者になる

いろいろ備忘録日記

主に .NET と Python絡みのメモを公開しています。

LINQ to CSV (CodeProject, CSVデータをLINQで扱うライブラリ, LinqToCsv)

C#

CodeProjectに

という記事があったので、メモメモ。
ついでにちょっとサンプル書いてみました。使いやすいですね。
ライブラリ内の各クラスについては、上記記事内で詳しく記述されています。
使い方も分かりやすく説明されているので、利用する場合は元記事を見ると
すぐ分かりますです。


インストールは、NuGetでいけます。

Install-Package LINQToCSV

以下、サンプル。
予め以下のようなCSVファイルがあるとします。
(Test.csv)

1,name1,33,2013/11/10
2,name2,34,2013/11/11

(WithHeader.csv)

DataId,PersonName,PersonAge,Day
1,name1,1,2013/11/10 0:00:00
20,name20,20,2013/11/30 0:00:00
15,name15,15,2013/11/25 0:00:00
namespace ConsoleApplication1
{
  using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Text;
  using System.Threading.Tasks;

  using LINQtoCSV;

  class Program
  {
    static void Main()
    {
      new Program().Execute();
    }

    public void Execute()
    {
      //
      // LINQ to CSVのサンプル.
      //   元ネタ: http://www.codeproject.com/Articles/25133/LINQ-to-CSV-library
      //
      // LINQ to CSVはNuGetでインストールできる.
      //   Install-Package LINQToCSV
      //
      
      // 
      // ヘッダー無しのCSVファイル読み込み.
      //
      // コンテキストを構築.
      var context = new CsvContext();

      //
      // CSVの情報を示すオブジェクトを構築.
      //
      var description = new CsvFileDescription
      {
        SeparatorChar = ',',
        FirstLineHasColumnNames = false,
        EnforceCsvColumnAttribute = true,
        TextEncoding = Encoding.UTF8
      };

      //
      // 読み取り.
      //
      var nameAndBirthDays = from   aData in context.Read<CSVData>("Test.csv", description)
                             select new 
                             {
                               aData.Name, 
                               aData.BirthDay 
                             };

      foreach (var data in nameAndBirthDays) 
      {
        Console.WriteLine(data);
      }

      //
      // 書き込み.
      //
      var dataList = context.Read<CSVData>("Test.csv", description).ToList();

      dataList.Add(new CSVData
      {
        Id = 3,
        Name = "name3",
        Age = 35,
        BirthDay = DateTime.Now.AddDays(-100).Date
      });

      context.Write<CSVData>(dataList, "Test2.csv", description);

      //
      // 確認.
      //
      foreach (var data in context.Read<CSVData>("Test2.csv", description).Select(_ => new { _.Name, _.BirthDay }))
      {
        Console.WriteLine(data);
      }

      //
      // ヘッダー付きのCSVファイルを読み込み.
      //
      description = new CsvFileDescription
      {
        SeparatorChar = ',',
        FirstLineHasColumnNames = true,
        TextEncoding = Encoding.UTF8
      };

      var query = from    data in context.Read<WithHeaderCSVData>("WithHeader.csv", description)
                  orderby data.Id
                  select  new 
                  {
                    data.Name,
                    data.BirthDay
                  };

      foreach (var data in query)
      {
        Console.WriteLine(data);
      }
    }
  }

  class CSVData
  {
    [CsvColumn(FieldIndex=1)]
    public int Id { get; set; }
    [CsvColumn(FieldIndex=4)]
    public DateTime BirthDay { get; set; }
    [CsvColumn(FieldIndex=2)]
    public string Name { get; set; }
    [CsvColumn(FieldIndex=3)]
    public int Age { get; set; }

  }

  class WithHeaderCSVData
  {
    [CsvColumn(Name="DataId", FieldIndex = 1)]
    public int Id { get; set; }
    [CsvColumn(Name="Day", FieldIndex = 4)]
    public DateTime BirthDay { get; set; }
    [CsvColumn(Name="PersonName", FieldIndex = 2)]
    public string Name { get; set; }
    [CsvColumn(Name="PersonAge", FieldIndex = 3)]
    public int Age { get; set; }
  }
}

================================
過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。