Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在文本文件中搜索关键字,直到遇到字符串_C#_Performance_Linq - Fatal编程技术网

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

C# 在文本文件中搜索关键字,直到遇到字符串,c#,performance,linq,C#,Performance,Linq,我正在写一个程序来帮助我在数千个文件中搜索关键字。每个文件都有不必要的行,我需要忽略它们,因为它们会影响结果。幸运的是,它们都位于这些文件中的特定行之后。 我已经得到的是一个搜索,不忽略该特定行之后的行,返回包含关键字的文件名的可枚举项 var searchResults = files.Where(file => File.ReadLines(file.FullName) .Any(line =>

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

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行。

如果您想从相当大的字符串中删除特定的字符串,我希望您查看下面的链接

编辑:根据您的新内容进行编辑

我认为我的方法有点原始,但有点有效

string FileString = "Your String to search from";
int LastIndexToRead = FileString .IndexOf("Your Specific String");
string NewStr = FileString .Substring(0, LastIndexToRead);
如果您的文件大得多,我建议您将字符串分成多个部分,以获得更好的性能



希望对您有所帮助

您可以并行处理文件,只需在“文件”后面添加aspallel()。这将提高文件处理速度。 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;
                }
            }
        }
IEnumerable parallelFiles=files.AsParallel();
var结果=新的ConcurrentBag();
foreach(并行文件中的var文件)
{
foreach(File.ReadLines(File.FullName)中的字符串行)
{
if(行包含(关键字))
{
result.Add(file.FullName);
打破
}
else if(行包含(停止字))
{
打破
}
}
}

您可能可以使用
可枚举的
执行一些操作,该
可枚举的
读取行
返回

如果每个文件中可以忽略的行都位于特定行号之后,则可以从可枚举项中剪切这些行(可能需要ToList()或其他任何优先项)

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

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

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

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

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

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

我的主要问题是我不知道如何忽略“string”后面的行。搜索“yyy”行会在结果中产生太多的误报。你看过这个问题吗?位置是动态的,但它始终是相同的字符串,因此很容易识别。你所写的正是我想要做的,但是在linq中这可能吗?这确实有帮助,但是对于关键字只出现在“yyy”行中的情况呢?这仍然会导致一些误报。不完全是这样,我认为您的代码假设“myString”总是存在于我想忽略的行中,但事实并非如此。“myString”是文件中用作分隔符的单行。我想忽略“myString”之后的每一行,即使它包含关键字。好的,因此
myString
是您想要停止搜索的完整行,而
关键字
是您要查找的单词。我现在看到Ghasan基本上有相同的解决方案。如果适合你,就把它给他。