gpt4 book ai didi

c# - 在二进制流上实现 ReadLine() 的最有效方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 18:01:39 24 4
gpt4 key购买 nike

如果我在任何时候错了,请随时纠正我...

我正在尝试阅读 CSV (逗号分隔值)文件使用 .NET 文件 I/O 类。现在的问题是,这个 CSV 文件可能在某些字段和标准文本模式中包含一些带有软回车的字段(即单独的\r 或\n 标记,而不是文本文件中用于结束一行的标准\r\n) I/O 类 StreamReader 不遵守标准约定,将软回车视为硬回车,从而损害 CSV 文件的完整性。

现在使用 BinaryReader 类似乎是唯一的选择,但 BinaryReader 没有 ReadLine() 函数,因此需要我自己实现 ReadLine()。

我当前的方法一次从流中读取一个字符并填充 StringBuilder 直到获得\r\n(忽略所有其他字符,包括单独的\r 或\n),然后返回 StringBuilder 的字符串表示形式(使用 ToString( ))。

但我想知道:这是实现 ReadLine() 函数的最有效方式吗?请赐教。

最佳答案

它可能是。就顺序而言,它只通过每个 char 一次,所以它是 O(n) (其中 n 是流的长度),所以这不是问题。要读取单个字符,BinaryReader 是您最好的选择。

我要做的是上课

public class LineReader : IDisposable
{
private Stream stream;
private BinaryReader reader;

public LineReader(Stream stream) { reader = new BinaryReader(stream); }

public string ReadLine()
{
StringBuilder result = new StringBuilder();
char lastChar = reader.ReadChar();
// an EndOfStreamException here would propogate to the caller

try
{
char newChar = reader.ReadChar();
if (lastChar == '\r' && newChar == '\n')
return result.ToString();

result.Append(lastChar);
lastChar = newChar;
}
catch (EndOfStreamException)
{
result.Append(lastChar);
return result.ToString();
}
}

public void Dispose()
{
reader.Close();
}
}

或类似的东西。

(警告:代码未经测试,按原样提供,不提供任何形式的明示或暗示保证。如果该程序被证明有缺陷或破坏地球,您将承担所有必要的服务、修理或更正的费用。)

关于c# - 在二进制流上实现 ReadLine() 的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/308615/

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