gpt4 book ai didi

c# - .NET C# - 随机访问文本文件 - 没有简单的方法?

转载 作者:IT王子 更新时间:2023-10-29 04:34:07 26 4
gpt4 key购买 nike

我有一个文本文件,其中包含多个“记录”。每条记录都包含一个名称和一组数字作为数据。

我正在尝试构建一个将通读文件的类,仅显示所有记录的名称,然后允许用户选择他/她想要的记录数据。

我第一次浏览文件时,只读取了标题名称,但我可以跟踪标题在文件中的“位置”。我需要随机访问文本文件以在用户请求后查找每条记录的开头。

我必须这样做,因为文件太大,无法完全读入内存 (1GB+) 以及应用程序的其他内存需求。

我已经尝试使用 .NET StreamReader 类来完成此操作(它提供了非常易于使用的“ReadLine”功能,但是无法捕获文件的真实位置(BaseStream 属性中的位置是倾斜的由于类使用的缓冲区)。

在 .NET 中没有简单的方法可以做到这一点吗?

最佳答案

提供了一些很好的答案,但我找不到适合我这个非常简单的案例的源代码。就在这里,希望它能为其他人节省我四处寻找的时间。

我指的“非常简单的情况”是:文本编码是固定宽度的,行结束字符在整个文件中是相同的。这段代码在我的情况下效果很好(我正在解析一个日志文件,有时我必须在文件中查找,然后返回。我实现的只是足以完成我需要做的事情(例如:只有一个构造函数,并且只覆盖 ReadLine()),因此您很可能需要添加代码……但我认为这是一个合理的起点。

public class PositionableStreamReader : StreamReader
{
public PositionableStreamReader(string path)
:base(path)
{}

private int myLineEndingCharacterLength = Environment.NewLine.Length;
public int LineEndingCharacterLength
{
get { return myLineEndingCharacterLength; }
set { myLineEndingCharacterLength = value; }
}

public override string ReadLine()
{
string line = base.ReadLine();
if (null != line)
myStreamPosition += line.Length + myLineEndingCharacterLength;
return line;
}

private long myStreamPosition = 0;
public long Position
{
get { return myStreamPosition; }
set
{
myStreamPosition = value;
this.BaseStream.Position = value;
this.DiscardBufferedData();
}
}
}

这是一个如何使用 PositionableStreamReader 的例子:

PositionableStreamReader sr = new PositionableStreamReader("somepath.txt");

// read some lines
while (something)
sr.ReadLine();

// bookmark the current position
long streamPosition = sr.Position;

// read some lines
while (something)
sr.ReadLine();

// go back to the bookmarked position
sr.Position = streamPosition;

// read some lines
while (something)
sr.ReadLine();

关于c# - .NET C# - 随机访问文本文件 - 没有简单的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/265639/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com