C# 搜索文件中的文本
如果我有很多文本文档,其中一个有我要找的单词。 那么,如何在所有文档中搜索? 像这样C# 搜索文件中的文本,c#,C#,如果我有很多文本文档,其中一个有我要找的单词。 那么,如何在所有文档中搜索? 像这样 FileStream File = new FileStream(@"C:\Users\user\Desktop\input\file1.txt", FileMode.Open, FileAccess.Read); StreamReader reader = new StreamReader(File); 我有file1
FileStream File = new FileStream(@"C:\Users\user\Desktop\input\file1.txt",
FileMode.Open, FileAccess.Read);
StreamReader reader = new StreamReader(File);
我有file1,file2,…。您需要按如下方式循环文件并搜索每个.txt文件:
string directory = @"C:\Users\user\Desktop\input";
string searchText ="Search text";
string[] allFiles = Directory.GetFiles(directory, "*.txt");
foreach (string file in allFiles)
{
string[] lines = File.ReadAllLines(file);
if(lines.Any(l => l.Contains(searchText)))
{
//It means "Search text" is found in this file and do whatever you want
}
}
首先生成要搜索的路径集合 如果这是同一目录中的文件1、文件2等,则这将起作用:
int numberOfFiles = //...
string word = //...
var filesThatContainWord = Enumerable.Range(1, numberOfFiles)
.Select(i => $@"C:\Users\user\Desktop\input\file{i}.txt")
.Where(path => File.ReadLines(path).Any(line => line.Contains(word));
将File.ReadLines
与Any
一起使用,好处是只读取每个文件,直到找到指定的单词
通过不将整个文件加载到内存中,它还可以节省内存
这可以封装到一个方法中:
IEnumerable<string> ContainsWord(IEnumerable<string> paths, string word)
=> paths.Where(path => File.ReadLines(path).Any(line => line.Contains(word));
您可以使用逐行读取文件。如果您有大文件,这可以减少内存消耗。
以下是示例代码:
var searchText = "sometext";
var directory = @"C:\Users\user\Desktop\input";
foreach (var fileName in Directory.GetFiles(directory, "*.txt"))
{
using (var fileStream = File.OpenRead(fileName))
{
using (var streamReader = new StreamReader(fileStream))
{
string line;
var lineNum = 1;
while ((line = streamReader.ReadLine()) != null)
{
if (line.Contains(searchText))
{
Console.WriteLine($"Found {searchText} at line {lineNum}");
}
lineNum++;
}
}
}
}
非常感谢你。
var searchText = "sometext";
var directory = @"C:\Users\user\Desktop\input";
foreach (var fileName in Directory.GetFiles(directory, "*.txt"))
{
using (var fileStream = File.OpenRead(fileName))
{
using (var streamReader = new StreamReader(fileStream))
{
string line;
var lineNum = 1;
while ((line = streamReader.ReadLine()) != null)
{
if (line.Contains(searchText))
{
Console.WriteLine($"Found {searchText} at line {lineNum}");
}
lineNum++;
}
}
}
}