我正在编写一个程序来帮助我在数千个文件中搜索关键字。这些文件中的每一个都有不必要的行,我需要忽略它们,因为它们会混淆结果。幸运的是,它们都位于这些文件中的特定行之后 我已经得到的是搜索,而不忽略该特定行之后的行,返回包含关键字的文件名的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行。
答案 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()或其他任何行。)
如果要忽略的部分的位置是动态的,那么可能您可以从标题字符串或类似字符串中识别它?
如果是这样,您最好的选择可能是: