首页 > 解决方案 > 如何使用 StreamReader 从第 x 行读取到第 y 行

问题描述

我有一个文本文件,其中包含许多分布在多行的短篇小说。我想一次获取一个故事并将其转换为字符串。

例子:

//Story A
Aaaa AAA aaaaa AAA
Aaa A A aaaa AA aaa
A Aaaa AAA aaaaa A A

//Story B
BBB b BBb BB bbb BB
BBB bb bb bb BB BB
BB bbb BBBB bbbb

如何在不加载故事 B 的情况下获取故事 A 的所有行并将其转换为字符串?(会有很多其他的故事,所以加载它们不是一种选择,因为它会占用大量的 RAM)

标签: c#winforms

解决方案


System.IO 命名空间中的静态文件类有很多方便的方法来处理文件。File.ReadLines 方法将节省内存:

public static System.Collections.Generic.IEnumerable<string> ReadLines (string path);

关键是它逐行读取文件,只保留内存中的当前行(加上当前文件缓冲区,但不是整个文件)。

使用一些 LINQ,您可以获得正确的故事

string storyTitle = "//Story A";
var story = String.Join(Environment.NewLine,
    File.ReadLines(theFile)
    .SkipWhile(s => s != storyTitle)
    .Skip(1) // Skip the current title
    .TakeWhile(s => !s.StartsWith("//")) // Next story title
);

我们必须用 跳过当前故事标题.Skip(1),否则.TakeWhile立即停止阅读行。


推荐阅读