Библиотека LINQ to CSV - Быстрое начало
ОГЛАВЛЕНИЕ
Быстрое начало
Чтение из файла
- В вашем проекте добавьте ссылку на LINQtoCSV.dll, которую вы сгенерировали во время установки.
- Файл будет прочитан в 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 в исходниках.
Запись в файл
Выполняется аналогично чтению из файла.
- В вашем проекте добавьте ссылку на LINQtoCSV.dll.
- Метод 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 CsvFileDescription6. Создайте объект CsvContext:
{
SeparatorChar = '\t', // с разделителями табуляции
FirstLineHasColumnNames = false, // в первой записи нет имен столбцов
FileCultureName = "nl-NL" // применяем формат, используемый в Голландии
};
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.