Подтвердить что ты не робот

Поиск конкретной строки и возврата всей строки

Мне бы хотелось найти все экземпляры строки в текстовом файле, а затем добавить в массив полные строки, содержащие указанную строку.

Например:

eng    GB    English
lir    LR    Liberian Creole English
mao    NZ    Maori

Поиск, например, должен добавить первые две строки в массив, включая, конечно, еще много экземпляров 'eng' в файле.

Как это сделать, используя ввод текстового файла и С#?

4b9b3361

Ответ 1

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

List<string> found = new List<string>();
string line;
using(StreamReader file =  new StreamReader("c:\\test.txt"))
{
   while((line = file.ReadLine()) != null)
   {
      if(line.Contains("eng"))
      {
         found.Add(line);
      }
   }
}

или вы можете использовать yield return для возврата перечисляемых

Ответ 2

Одна строка:

using System.IO;
using System.Linq;

var result = File.ReadAllLines(@"c:\temp").Select(s => s.Contains("eng"));

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

public static IEnumerable<string> ReadAndFilter(this FileInfo info, Predicate<string> condition)
{
    string line;

    using (var reader = new StreamReader(info.FullName))
    {
        while ((line = reader.ReadLine()) != null)
        {
            if (condition(line))
            {
                yield return line;
            }
        }
    }
}

Использование:

var result = new FileInfo(path).ReadAndFilter(s => s.Contains("eng"));

Ответ 3

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

string searchKeyword = "eng";
string fileName = "Some file name here";
string[] textLines = File.ReadAllLines(fileName);
List<string> results = new List<string>();

foreach (string line in textLines)
{
    if (line.Contains(searchKeyword))
    {
        results.Add(line);
    }
}

Ответ 4

Объект File содержит статический метод ReadLines, который возвращает строку за строкой, в отличие от ReadAllLines, который возвращает массив и, следовательно, должен загружать полный файл в память.

Таким образом, используя File.ReadLines и LINQ, эффективное и короткое решение может быть записано как:

var found = File.ReadLines().Where(line => line.Contains("eng")).ToArray();

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