CSV для отображения объектной модели - PullRequest
31 голосов
/ 17 августа 2010

У меня есть файл CSV, который я хочу прочитать в список.Вот пример файла:

Plant,Material,"Density, Lb/ft3",Storage Location
FRED,10000477,64.3008,3300
FRED,10000479,62.612,3275
FRED,10000517,90,3550
FRED,10000517,72,3550
FRED,10000532,90,3550
FRED,10000532,72,3550
FRED,10000550,97,3050

Я знаю, что могу вручную прочитать файл CSV и построить список с помощью обычного StreamReader, но мне было интересно, есть ли лучший способ, возможно, с использованием LINQ?

Ответы [ 4 ]

37 голосов
/ 17 августа 2010

Для конкретных данных, показанных в вашем вопросе ...

var yourData = File.ReadAllLines("yourFile.csv")
                   .Skip(1)
                   .Select(x => x.Split(','))
                   .Select(x => new
                                {
                                    Plant = x[0],
                                    Material = x[1],
                                    Density = double.Parse(x[2]),
                                    StorageLocation = int.Parse(x[3])
                                });

Если у вас уже есть тип, объявленный для ваших данных, вы можете использовать его вместо анонимного типа.

Обратите внимание, что этот код не является надежным вообще .Он не будет корректно обрабатывать значения, содержащие запятые / переводы строк и т. Д., Строковые значения в кавычках или любые другие эзотерические элементы, которые часто встречаются в файлах CSV.

36 голосов
/ 17 августа 2010

Вы можете использовать такой простой код, который игнорирует заголовок и не работает с кавычками, но может быть достаточным для ваших нужд.

from line in File.ReadAllLines(fileName).Skip(1)
let columns = line.Split(',')
select new
{
  Plant = columns[0],
  Material = int.Parse(columns[1]),
  Density = float.Parse(columns[2]),
  StorageLocation = int.Parse(columns[3])
}

Или вы можете использовать библиотеку, как предлагали другие.

6 голосов
/ 11 октября 2010

Я написал простую библиотеку, позволяющую разработчикам использовать LINQ для файлов CSV. Вот мой пост в блоге об этом: http://procbits.com/2010/10/11/using-linq-with-csv-files/

В вашем случае вам придется изменить строку заголовка, чтобы она выглядела следующим образом:

Plant,Material,DensityLbft3,StorageLocation

И тогда вы можете проанализировать файл следующим образом:

var linqCSV = new CsvToXml("csvfile", true);
linqCsv.TextQualifier = null;

linqCsv.ColumnTypes.Add("Plant", typeof(string));
linqCsv.ColumnTypes.Add("Material", typeof(int));
linqCsv.ColumnTypes.Add("DensityLbft3", typeof(double));
linqCsv.ColumnTypes.Add("StorageLocation", typeof(int));

linqCsv.Convert();

Вы можете использовать LINQ следующим образом:

var items = from item in linqCsv.DynamicRecords
            where item.Plant == "Fred" && item.DensityLbft3 >= 62.6
            orderby item.StorageLocation
            select item;

Надеюсь, что это помогает или работает для вас.

6 голосов
/ 17 августа 2010

Для этого есть код-проект:

http://www.codeproject.com/KB/linq/LINQtoCSV.aspx

Однако, вы можете посмотреть здесь:

Linq и потоковый ридер, получающий строки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...