在文本文件中搜索关键字,直到遇到字符串

时间:2015-07-30 08:42:10

标签: c# performance linq

我正在编写一个程序来帮助我在数千个文件中搜索关键字。这些文件中的每一个都有不必要的行,我需要忽略它们,因为它们会混淆结果。幸运的是,它们都位于这些文件中的特定行之后 我已经得到的是搜索,而不忽略该特定行之后的行,返回包含关键字的文件名的Enumerable。

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

是否有一种简单快捷的方法来实现此功能?它不一定必须在Linq,因为我甚至不确定这是否可行。

编辑:
一个让它更清晰的例子。 这就是文本文件的结构:
XXX
XXX

YYY
YYY

我想搜索xxx行,直到找到关键字或字符串,然后跳到下一个文件。我想在搜索中忽略yyy行。

5 个答案:

答案 0 :(得分:4)

试试这个:

var searchResults = files.Where(file => File.ReadLines(file.FullName)
                                            .TakeWhile(line => line != "STOP")
                                            .Any(line => line.Contains(keyWord)))
                                            .Select(file => file.FullName);

答案 1 :(得分:1)

您可以并行处理文件,只需在“files”之后添加AsParallel()。这应该可以提高文件处理速度。 ReadLines在搜索之前不读取整个文件,因此它应该按预期工作。

编辑:抱歉第一次误读了你的问题并且没有注意到停止词。鉴于我认为避免LINQ会更容易:

        IEnumerable<FileInfo> parallelFiles = files.AsParallel();
        var result = new ConcurrentBag<string>();
        foreach (var file in parallelFiles)
        {
            foreach (string line in File.ReadLines(file.FullName))
            {
                if (line.Contains(keyWord))
                {
                    result.Add(file.FullName);
                    break;
                }
                else if (line.Contains(stopWord))
                {
                    break;
                }
            }
        }

答案 2 :(得分:1)

这只是一个小修改:忽略不包含搜索字符串的行,只读取第一个匹配项:

var searchResults = files.Where(file => File.ReadLines(file.FullName)
                                            .TakeWhile(line => != myString)
                                            .Any(line => line.IndexOf(keyWord) > -1)
                               )
                         .Select(file => file.FullName);

答案 3 :(得分:0)

如果你想从一个非常大的字符串中删除一个特定的字符串,我更喜欢你看看下面的链接

Fastest way to remove chars from string

修改:根据您的新内容

据我说,我的方式有点原始,但有点有效

string FileString = "Your String to search from";
int LastIndexToRead = FileString .IndexOf("Your Specific String");
string NewStr = FileString .Substring(0, LastIndexToRead);

如果您的文件更大,我建议您将字符串分成多个部分以获得更好的效果。

希望有所帮助

答案 4 :(得分:0)

您可以使用ReadLines返回{ class: 1, users: [{ name: 'abc', surname: 'def' }, { name: 'xyz', surname: 'wef' }, { name: 'abc', surname: 'pqr' }] } 来执行某些操作。

如果您在每个文件中可以忽略的行位于特定行号后面,您可以从Enumerable中删除这些行(您可能需要ToList()或其他任何行。)

如果要忽略的部分的位置是动态的,那么可能您可以从标题字符串或类似字符串中识别它?

如果是这样,您最好的选择可能是:

  • 打开文件
    • 逐行阅读(手动)
      • 看看&#34;从这里跳过&#34;串
        • 跳过此文件的其余部分
      • 查找字符串匹配搜索关键字。
        • 将文件记录为匹配