Как выполнить текстовый поиск по столбцу внутри файла CSV с помощью C #?

#c# #list #csv #search

#c# #Список #csv #Поиск

Вопрос:

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

В файле CSV есть три столбца «идентификатор», «заголовок» и «рейтинг», и я хочу выполнить поиск по столбцу заголовка.

Я наткнулся на предложение превратить CSV в список, а затем выполнить поиск по нему.

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

 var reader = new StreamReader(File.OpenRead(@"books.csv"));
            List<string> listA = new List<string>();
            List<string> listB = new List<string>();
            while (!reader.EndOfStream)
            {
                var line = reader.ReadLine();
                var values = line.Split(';');

                listA.Add(values[0]);
                listB.Add(values[1]);

                foreach (var column1 in listA)
                {
                    Console.WriteLine(column1);
                }

                foreach (var column2 in listA)
                {
                    Console.WriteLine(column2);
                }
            }
  

Но я не понимаю, как это работает, и я получаю сообщение об ошибке

Индекс находился за пределами массива

Может ли кто-нибудь указать мне правильное направление, потому что я совсем заблудился?

Комментарии:

1. Вы, вероятно, ищете ‘using var sr = new StreamReader(fileName); string content = sr.ReadToEnd();’ вместо этого. Но… Лучшее решение действительно зависит от нескольких факторов. Насколько велик файл? Будете ли вы выполнять несколько поисков во время одного выполнения кода (в этом случае действительно может быть лучше кэшировать исходные данные в памяти). Как будут использоваться данные? Вам нужны все данные (идентификатор, заголовок, рейтинги) для искомой записи?

2. Вы можете просто прочитать файл с помощью CSVHelper. С этого момента, я думаю, вы можете разобраться с остальным.

3. Я делаю это для школьного проекта, поэтому данные на самом деле не сложные. И помощник CSV был весьма полезен, так что спасибо за это.

Ответ №1:

Если вы используете StreamReader , то вам не нужно вызывать File.OpenRead (поскольку StreamReader может справиться с этим, и это изменит кодировку ваших данных).

Вы читаете файл csv (значения, разделенные запятыми), но вы делаете разделение на точки с запятой. (Вы можете проверить это, открыв свой файл CSV в блокноте).

Также вы выполняете разделение, но не проверяете, есть ли 2 элемента. Таким образом, значения [1] могут привести к тому, что индекс был за пределами ошибки массива.

В качестве отправной точки попробуйте:

 var listA = new List<string>();
var listB = new List<string>();

using (var reader = new StreamReader(@"books.csv"))
{
    while (!reader.EndOfStream)
    {
        var line = reader.ReadLine();
        if (!string.IsNullOrEmpty(line))
        {
            var values = line.Split(',');

            if (values.Length > 1)
            {
                listA.Add(values[0]);
                listB.Add(values[1]);
            }
        }
    }
}
  

Согласно комментариям. Лучшим способом написания кода будет использование стороннего пакета, такого как CSV Helper (https://joshclose.github.io/CsvHelper).

Комментарии:

1. Привет, Грег. Я наконец смог загрузить данные и выполнить поиск по ним, и помощник CSV действительно был полезен. Большое спасибо за помощь.