Читайте CSV, используя LINQ

Посмотрите на этот вопрос

Существует ссылка на эту статью: неверно понятый мьютекс , где объясняется использование мьютекса.

23
задан Joel 25 February 2011 в 11:21
поделиться

4 ответа

var stuff = from l in File.ReadAllLines(filename)
            let x = l.Split(new [] {',', ' '}, StringSplitOptions.RemoveEmptyEntries)
                     .Skip(1)
                     .Select(s => int.Parse(s))
            select new
            {
                Sum = x.Sum(),
                Average = x.Average()
            };

Если вы читаете большие файлы и использование памяти вызывает беспокойство, то с помощью .NET 4 будет лучше работать следующее:

var stuff = from l in File.ReadLines(filename)
            let x = l.Split(new [] {',', ' '}, StringSplitOptions.RemoveEmptyEntries)
                     .Skip(1)
                     .Select(s => int.Parse(s))
            select new
            {
                Sum = x.Sum(),
                Average = x.Average()
            };

В обоих случаях переменная stuff содержит перечислимое, которое фактически не будет выполнено, пока вы не начнете читать из него (например, внутри цикла foreach).

39
ответ дан Bennor McCarthy 25 February 2011 в 11:21
поделиться

Я только что обнаружил библиотеку LinqToCsv, она выполняет все операции разбора, а затем вы можете запрашивать объекты, такие как коллекции, и она поддерживает отложенное чтение:

http://www.codeproject.com/Articles / 25133 / LINQ к CSV-библиотеки

2
ответ дан 0lukasz0 25 February 2011 в 11:21
поделиться

Что-то вроде этого может быть:

var csv = @"A, 22, 23, 12
B, 32, 4, 33
C, 34, 3 ,33";

var lines =
    csv.Split('\n').Select(x => x.Split(',').Skip(1).Select(n => int.Parse(n))).Select(x => new {Sum = x.Sum(), Average = x.Average()});
foreach (var line in lines)
{
    Console.WriteLine("Sum: " + line.Sum);
    Console.WriteLine("Average: " + line.Average);
}

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

0
ответ дан Daniel Hilgarth 25 February 2011 в 11:21
поделиться

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

Я даю вам лучшее универсальное решение с использованием Regex и простое в использовании:

var stuff = File.ReadAllLines(csvFilePath)
    .Skip(1) // For header
    .Select(s => Regex.Match(s, @"^(.*?),(.*?),(.*?),(.*?),(.*?)$"))
    .Select(data => new 
    {
        Foo = data.Groups[1].Value,
        Bar = data.Groups[2].Value,
        One = data.Groups[3].Value,
        Two = data.Groups[4].Value,
    });

И вы можете найти более подробную информацию здесь https://stackoverflow.com/a/18147076/196526

-1
ответ дан Bastien Vandamme 25 February 2011 в 11:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: