Поиск конкретной строки и возврата всей строки
Мне бы хотелось найти все экземпляры строки в текстовом файле, а затем добавить в массив полные строки, содержащие указанную строку.
Например:
eng GB English
lir LR Liberian Creole English
mao NZ Maori
Поиск, например, должен добавить первые две строки в массив, включая, конечно, еще много экземпляров 'eng' в файле.
Как это сделать, используя ввод текстового файла и С#?
Ответы
Ответ 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
, поскольку, как кажется, требуемый термин появляется в начале каждой строки.