Читать CSV с Linq

1

У меня есть следующие строки (больше, но этот образец в порядке) в CSV файле.

Date,Open,High,Low,Close,Volume,Adj Close
2012-11-01,77.60,78.12,77.37,78.05,186200,78.05
2012-10-31,76.96,77.75,76.96,77.47,290700,77.47
2012-10-26,77.30,77.62,76.86,77.36,195100,77.36

Мне нужно выполнить несколько различных функций для данных, каждый из которых нуждается только в определенных полях из строки. т.е. для функции 1 понадобятся 2-й и 3-й наборы данных из каждой строки, для функции 2 потребуется 4-й набор данных. Как мне это сделать с LINQ (пропуская первую строку)?

  • 3
    Что вы исследовали, когда дело доходит до анализа файла CSV? что ты уже испробовал? Какие проблемы у вас были с вашими попытками решения?
  • 0
    Я нашел следующее в других сообщениях, делая исследование. let x = l.Split(new [] {',', ' '}, StringSplitOptions.RemoveEmptyEntries) .Skip(1) .Select(s => int.Parse(s)) который кажется довольно хорошим решением для моего проблема, но некоторые вещи путают мой синтаксис мудрый. Команда пропуска, это пропускает строку или первый сегмент строки? И разделение, это просто разделить наборы данных между запятыми на отдельные объекты? вот где я запутался
Показать ещё 2 комментария
Теги:
linq
csv

2 ответа

3

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

            var lines = File.ReadAllLines(@"Linq.csv").Select(x => x.Split(','));
            //Considering each line contains same no. of elements
            int lineLength = lines.First().Count();  
            var CSV = lines.Skip(1)
                       .SelectMany(x => x)
                       .Select((v, i) => new { Value = v, Index = i % lineLength })
                       .Where(x => x.Index == 2 || x.Index == 3)
                       .Select(x => x.Value);
            foreach (var data in CSV)
            {
                Console.WriteLine(data);
            }

Шаги: -

Шаг 1 - Прочитайте все строки из файла CSV и разделите их на Comma (,), что приведет к массиву строк os с каждым значением.

Шаг 2 - Пропустите первый массив (который удерживает заголовки), затем используйте SelectMany, чтобы сгладить список в один. Далее вам нужно установить индекс для каждого набора (в списке сглаживания), который я делаю с помощью Select opertaor, последнее, что осталось, - это фильтрация и выбор элемента.

0

Вы можете попробовать следующий код для функции 1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню