如何在大型文本文件中搜索字符串



我想获得包含某个单词的行,该单词不能像概要文件ID一样重复,而不进行循环以分别读取每一行。因为如果我要查找的单词在文本文件的最后一行,这将花费大量时间来获取它,并且如果搜索过程是针对多个单词并提取包含它的行,我想这需要很多时间。

行文本文件示例姓名,身份证,图像,年龄,地点,链接

string word = "13215646";
string output = string.Empty;

using (var fileStream = File.OpenRead(FileName))
using (var streamReader = new StreamReader(fileStream, Encoding.UTF8))
{
String line;
while ((line = streamReader.ReadLine()) != null)
{
string[] strList = line.Split(',');
if (word == strList[1]) // check if word = id
{
output = line;
break;
}
}
}

您可以使用它来搜索文件:

var output = File.ReadLines(FileName).
Where(line => line.Split(',')[1] == word).
FirstOrDefault();

但它不会解决这个问题:

如果我要查找的单词在文本文件的最后一行,这将花费大量时间来获取它,如果搜索过程是针对多个单词并提取包含它的行,我认为这将花费很多时间。

对于基本文件,没有一种实用的方法可以避免这种情况

真正读取文件的唯一方法是维护索引,这需要对可能写入文件的所有内容进行绝对控制,或者如果您可以保证文件已经按重要列排序,在这种情况下,您可以执行类似二进制搜索的操作。

但对于随机的csv文件来说,两者都不太可能。这也是人们使用数据库的原因之一。

然而,我们也需要停下来检查这是否真的是你的问题。我希望上面的代码能够在现代硬件上在大约1到2秒内处理高达几百MB的文件,即使您需要查看整个文件。

您可以优化代码。以下是一些想法:

var ids = new ["13215646", "113"];
foreach(var line in File.ReadLines(FileName))
{
var id = line.Split(',', count: 3)[1]; // Optimization 1: Use: `count: 3`
if(ids.Contains(id)                    // Optimization 2: Search for multiple ids 
{
//Do what you need with the line
}
}

相关内容

  • 没有找到相关文章

最新更新