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

本文关键字:遇到 字符串 关键字 文本 文件 搜索 | 更新日期: 2023-09-27 18:05:34

我正在写一个程序来帮助我在数千个文件中搜索一个关键字。这些文件中的每一个都有不必要的行,我需要忽略它们,因为它们会扰乱结果。幸运的是,它们都位于这些文件中的特定行之后。
我已经得到的是一个搜索,没有忽略特定行之后的行,返回包含关键字的文件名的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行

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

试试这个:

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

您可以并行处理文件,只需在"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;
                }
            }
        }

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

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

您可以对ReadLines返回的Enumerable<string>做一些事情。

如果每个文件中可以忽略的行位于特定行号之后,则可以从Enumerable中删除这些行(您可能需要先使用ToList()或其他方法)。

如果要忽略的部分的位置是动态的,那么大概你可以从标题字符串或类似的地方识别它?

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

  • 打开文件
    • 逐行读取(手动)
      • 看"从这里跳过"字符串
        • 跳过该文件的其余部分
      • 查找字符串匹配的搜索关键字。
        • 记录匹配
        • 的文件

如果你想从一个相当大的字符串中删除一个特定的字符串,我建议你看看下面的链接

从字符串

中删除字符的最快方法

编辑:根据您的新内容

对我来说,我的方法有点原始,但有点有效

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

如果你的文件更大,那么我建议你将字符串分成多个部分以获得更好的性能。


希望有所帮助