Библиотека LINQ to CSV - Быстрое начало

ОГЛАВЛЕНИЕ

Быстрое начало

Чтение из файла

  1. В вашем проекте добавьте ссылку на LINQtoCSV.dll, которую вы сгенерировали во время установки.
  2. Файл будет прочитан в IEnumerable<T>, где T – это класс данных, который вы определили. Записи данных, прочитанные из файла, будут сохранены в объектах этого класса данных. Вы можете определить класс данных с помощью такого кода:
     using LINQtoCSV;
    using System;

class Product
{
    [CsvColumn(Name = "ProductName", FieldIndex = 1)]
    public string Name { get; set; }

    [CsvColumn(FieldIndex = 2, OutputFormat = "dd MMM HH:mm:ss")]
    public DateTime LaunchDate { get; set; }

    [CsvColumn(FieldIndex = 3, CanBeNull = false, OutputFormat = "C")]
    public decimal Price { get; set; }

    [CsvColumn(FieldIndex = 4)]
    public string Country { get; set; }

    [CsvColumn(FieldIndex = 5)]
    public string Description { get; set; }
}

Имея это определение, вы можете читать из IEnumerable<Product>.

Хотя этот пример только использует свойства, методы библиотеки также распознают простые поля. Только убедитесь, что ваши поля/свойства общедоступные.

Дополнительный атрибут CsvColumn позволяет вам определить, когда поле/свойство обязательное, как оно должно записываться в выходной файл и т.д.

       3.    Импортируйте пространство имен LINQtoCSV в начало исходного файла, откуда вы будете читать файл:
using LINQtoCSV;
       4.   Создайте объект CsvFileDescription и присвойте ему в качестве начальных значений параметры файла, который вы собираетесь читать. Это будет выглядеть примерно так:
    CsvFileDescription inputFileDescription = new CsvFileDescription
{
   SeparatorChar = ',',
    FirstLineHasColumnNames = true
};

С помощью этого можно определить, какой символ используется для разделения полей данных (запятая, табуляция и т.д.), содержит ли первая запись в файле имена столбцов, и многое другое.

      5.   Создайте объект CsvContext:
CsvContext cc = new CsvContext();

Это объект, который представляет методы Read и Write, которые вы будете использовать для чтения и записи файлов.

      6.    Прочитайте файл в IEnumerable<T>, используя метод Read объекта CsvContext, примерно так:
IEnumerable<Product> products =
    cc.Read<Product>("products.csv", inputFileDescription);

Этот код читает файл products.csv в переменную products, которая имеет тип IEnumerable<Product>.

      7.    Теперь вы можете получить доступ к переменной products через запрос LINQ, цикл foreach и т.д.:
var productsByName =
    from p in products
    orderby p.Name
    select new { p.Name, p.LaunchDate, p.Price, p.Description };

// или ...
foreach (Product item in products) { .... }

Ниже снова приводится код, читающий из файла, но теперь за один раз:

CsvFileDescription inputFileDescription = new CsvFileDescription
{
    SeparatorChar = ',',
    FirstLineHasColumnNames = true
};

CsvContext cc = new CsvContext();

IEnumerable<Product> products =
    cc.Read<Product>("products.csv", inputFileDescription);

// Данные сейчас доступны через переменную products.

var productsByName =
    from p in products
    orderby p.Name
    select new { p.Name, p.LaunchDate, p.Price, p.Description };

// или ...
foreach (Product item in products) { .... }

Вы можете найти тот же самый код в проекте SampleCode в исходниках.

Запись в файл

Выполняется аналогично чтению из файла.

  1. В вашем проекте добавьте ссылку на LINQtoCSV.dll.
  2. Метод Write принимает IEnumerable<T> и записывает каждый объект типа T в IEnumerable<T> как запись данных в файл. Определение вашего класса данных может выглядеть так:
using LINQtoCSV;
using System;

class Product
{
    [CsvColumn(Name = "ProductName", FieldIndex = 1)]
    public string Name { get; set; }

    [CsvColumn(FieldIndex = 2, OutputFormat = "dd MMM HH:mm:ss")]
    public DateTime LaunchDate { get; set; }

    [CsvColumn(FieldIndex = 3, CanBeNull = false, OutputFormat = "C")]
    public decimal Price { get; set; }

    [CsvColumn(FieldIndex = 4)]
    public string Country { get; set; }

    [CsvColumn(FieldIndex = 5)]
    public string Description { get; set; }
}

Дополнительный атрибут CsvColumn позволяет вам определить, какие форматы даты и чисел использовать при записи каждого поля данных. Подробное описание свойств CsvColumnCanBeNull, OutputFormat, и т.д.) доступно здесь. (

Хотя этот пример использует только свойства, вы также можете использовать простые поля.

Метод Write может успешно использовать анонимный тип для T, поэтому вы можете записать вывод запроса LINQ прямо в файл. В этом случае вы не определяете T сами. Позже будет приведен пример этого.

     3.    Импортируйте пространство имен LINQtoCSV в начало исходного файла, куда вы будете записывать файл:

using LINQtoCSV;
      4.   Убедитесь, что данные сохранились в объект, который реализует IEnumerable<T>, такой как List<T>, или IEnumerable<T>, возвращаемый методом Read.
List<Product> products2 = new List<Product>();
// Заполняем список продуктами
// ...
     5.   Создайте объект CsvFileDescription, и инициалзируйте его с данными о файле, который вы будете записывать, в следующих строках:
CsvFileDescription outputFileDescription = new CsvFileDescription
{
    SeparatorChar = '\t', // с разделителями табуляции
    FirstLineHasColumnNames = false, // в первой записи нет имен столбцов
    FileCultureName = "nl-NL" // применяем формат, используемый в Голландии
};
     6.    Создайте объект CsvContext:
CsvContext cc = new CsvContext();
     7.    Вызовите метод Write, предоставляемый объектом CsvContext, чтобы записать содержимое вашегоIEnumerable<T> в файл:
cc.Write(
    products2,
    "products2.csv",
    outputFileDescription);

Этот код записывает объекты Product в переменной products2 в файл "products2.csv".

Этот код также записывает файл, но за один раз:

List<Product> products2 = new List<Product>();
// Заполняем список продуктами
// ...

CsvFileDescription outputFileDescription = new CsvFileDescription
{
    SeparatorChar = '\t', // с разделителями табуляции
    FirstLineHasColumnNames = false, // в первой записи нет имен столбцов
    FileCultureName = "nl-NL" // применяем формат, используемый в Голландии
};

CsvContext cc = new CsvContext();

cc.Write(
    products2,
    "products2.csv",
    outputFileDescription);   

Написание IEnumerable анонимного типа

Если у вас есть запрос LINQ, порождающий IEnumerable анонимного типа, записать этот IEnumerable в файл не сложно:

CsvFileDescription outputFileDescription = new CsvFileDescription
{
.....
};

CsvContext cc = new CsvContext();

// запрос LINQ, возвращающий IEnumerable анонимного типа
// в переменную productsNetherlands
var productsNetherlands =
    from p in products
    where p.Country == "Netherlands"
    select new { p.Name, p.LaunchDate, p.Price, p.Description };

// записываем содержимое переменной productsNetherlands в файл
cc.Write(
    productsNetherlands,
    "products-Netherlands.csv",
    outputFileDescription);

Здесь запрос LINQ выбирает все продукты для "Голландии" из переменной products и возвращает IEnumerable, содержащий объекты какого-либо анонимного типа, который имеет поля Name, LaunchDate, Price и Description. Затем метод Write записывает эти объекты в файл products-Netherlands.csv.