c# - 逐行读取一个大文本文件并搜索一个字符串

标签 c# string file

我目前正在开发一个读取大约 50000 行文本文件的应用程序。对于每一行,我需要检查它是否包含特定的字符串。

目前,我使用传统的 System.IO.StreamReader 逐行读取我的文件。

问题是文本文件的大小每次都会改变。我做了几个测试性能,我注意到当文件大小增加时,读取一行将花费更多时间。

例如:

读取包含 5000 行的 txt 文件:0:40
读取包含 10000 行的 txt 文件:2:54

读取 2 倍大的文件需要 4 倍的时间。我无法想象阅读一个 100000 行的文件需要多少时间。

这是我的代码:

using (StreamReader streamReader = new StreamReader(this.MyPath))
{
     while (streamReader.Peek() > 0)
     {
          string line = streamReader.ReadLine();

          if (line.Contains(Resources.Constants.SpecificString)
          {
               // Do some action with the string.
          }
     }
}

有没有办法避免这种情况:更大的文件 = 更多的时间来阅读一行?

最佳答案

试试这个:

var toSearch = Resources.Constants.SpecificString;
foreach (var str in File.ReadLines(MyPath).Where(s => s.Contains(toSearch))) {
    // Do some action with the string
}

这避免了通过在循环之前缓存值来在每次迭代中访问资源。如果这没有帮助,请尝试根据高级字符串搜索算法编写您自己的 Contains,例如 KMP .


注意:一定要使用File.ReadLines它懒惰地读取行(不像看起来相似的 File.ReadAllLines 一次读取所有行)。

关于c# - 逐行读取一个大文本文件并搜索一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16105856/

相关文章:

c# - 如何在 c# 中创建自定义操作并将其绑定(bind)到 wix 设置项目

c# - C#中如何将string[]实现为string[]?

c# - 我应该将图像存储在数据库还是文件夹中?

c# - 在 Windows 上使用 WiFi Direct Api?

c# - 如何将NugetPackages添加到共享项目?

Python 字节字符串在字典中打印不正确

C 去除字符串中的特殊字符

c++ - 在运行时向 vector 插入元素 C++。抛出运行时错误

java - 打印文件列表

c++ - 如何在 C++ 中获取以逗号分隔的整数序列的最后一个整数?