搜索特定字符串并返回整行



我想做的是在文本文件中找到字符串的所有实例,然后将包含所述字符串的整行添加到数组中。

例如:

eng    GB    English
lir    LR    Liberian Creole English
mao    NZ    Maori

例如,搜索eng必须将前两行添加到数组中,当然包括文件中更多的"eng"实例。

使用文本文件输入和C#,如何做到这一点?

您可以使用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返回可枚举

一行:

using System.IO;
using System.Linq;
var result = File.ReadAllLines(@"c:temp").Select(s => s.Contains("eng"));

或者,如果你想要一个更高效的内存解决方案,你可以推出一个扩展方法。您可以使用FileInfoFileStream等作为基本处理程序:

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"));

你可以试试下面的代码,我试过了,它正在中工作

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);
    }
}

File对象包含一个逐行返回的静态ReadLines方法,而ReadAllLines返回一个数组,因此需要在内存中加载完整的文件。

因此,通过使用File.ReadLines和LINQ,可以将一个有效而简短的解决方案写成:

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

至于最初的问题,可以通过用line.StartsWith替换line.Contains来进一步优化,因为所需的术语似乎出现在每行的开头。

最新更新