c# - 如何从大文件中读取特定量的数据

标签 c#

我有一个 1GB 文件,每行包含 1 个字符串。

我必须读取前 100MB,这样如果边界落在字符串的中间,则最后一行的整个内容都会包含在结果中。

在 C# 中实现此目的的最佳方法是什么?

最佳答案

一种选择是使用 StreamReader 读取行,但检查基础流上的Position:

List<string> lines = new List<string>();
using (var reader = File.OpenText("file.txt"))
{
    string line;
    while (reader.BaseStream.Position < DataLimit &&
           (line = reader.ReadLine()) != null)
    {
        lines.Add(line);
    }
}

这里有两个问题:

  • StreamReader 可能会缓冲数据,因此 Stream 实际上会比您读取的数据更进一步。为了解决这个问题,您需要在限制范围内添加一些额外的缓冲区,但即便如此,它仍然不会非常精确。
  • 在每行调用 Position 可能会显着减慢速度。

另一种选择是将您确实想要消耗的尽可能多的数据复制到MemoryStream中,然后继续阅读(并转换为文本)直到找到下一个换行符,然后附加最后的部分-line 数据到 MemoryStream 并最终在 MemoryStream 周围创建一个 StreamReader,但这又相当繁琐。

另一种选择是创建某种“长度限制”流包装器,您可以将限制设置得足够大以明确包含最后一行 - 同样,这可能会有些过度读取。

关于c# - 如何从大文件中读取特定量的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20393796/

相关文章:

c# - MethodBase.IsConstructor 无法按照静态构造函数指定的方式工作

c# - 对齐报告中的文本

c# - WP7 中的 HttpWebRequest 超时

c# - 如何更改表单在呈现 View 时的操作? (又名通过 ViewBag 或 ViewData)

c# - 如何在数据库C#中查找表的主键

c# - 如何使用 dapper 回滚事务

c# - 过滤 XML 文档部分的有效方法

c# - 如何在后面的代码中读取 WPF 发布版本号

c# - 如何检查 Ssh.NET 连接是否建立成功?

C# 访问路径 'C:\Documents and Settings\' 被拒绝