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基本上有相同的解决方案。如果适合你,就把它给他。