在文本文件中搜索关键字,直到遇到字符串
本文关键字:遇到 字符串 关键字 文本 文件 搜索 | 更新日期: 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);
如果你的文件更大,那么我建议你将字符串分成多个部分以获得更好的性能。
希望有所帮助