在文本文件中搜索,直到特定字符串

时间:2015-07-30 07:09:57

标签: c# performance linq

我正在编写一个程序来搜索文本文件,其中每个文件都有一个特定的字符串。目标是忽略该字符串后的所有内容。我当前的代码读取整个文本文件,并返回一个Enumerable结果文件名,其中找到了一个术语。

var searchResults = files.Where(file => File.ReadAllText(file.FullName).Contains(searchTerm)).Select(file => file.FullName);

是否可以在该特定字符串之后合并忽略所有行?性能非常重要,因为有数千个文件。

2 个答案:

答案 0 :(得分:7)

您可以将查询更改为:

var searchResults = files.Where(file => File.ReadLines(file.FullName).Any(line => line.Contains(searchTerm))
                         .Select(file => file.FullName));

您可以使用经过延迟评估的File.ReadAllText,而不是使用File.ReadLines,而应该在满足条件时停止阅读。

https://msdn.microsoft.com/en-us/library/vstudio/dd383503(v=vs.100).aspx

为了加快速度,您还可以使用Parallel LINQ:

var searchResults = files.AsParallel()
                         .Where(file => File.ReadLines(file.FullName).Any(line => line.Contains(searchTerm))
                         .Select(file => file.FullName));

答案 1 :(得分:1)

您可以逐行读取文件,如果找到值,则将其关闭:

    static string[] SearchFiles(string[] filesSrc, string searchTerm)
    {
        List<string> result = new List<string>();
        string line = "";
        StreamReader reader = null;

            for (int i = 0; i < filesSrc.Length; i++)
            {
                reader = new StreamReader(filesSrc[i]);
                while ((line = reader.ReadLine()) != null)
                    if (line.Contains(searchTerm)) { result.Add(filesSrc[i]); break; }
            }

        reader.Dispose();

        return result.ToArray();
    }

并使用它:string[] files = SearchFiles(yourfiles[], "searchTerm");

根据您的需要,您可以将File[]传递给此方法,然后使用完整路径获取字符串值,但是您没有提供File类的示例,并且很难实现它不知道你的班级究竟是什么样的。

P.S。 使用LINQ是另一种可能的解决方案,也是一种很好的解决方案(更不用说它只有1-2行代码)。

即兴performance test表明LINQ在这种情况下只慢了10-20%,因此坚持使用它可能更好。