当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在二进制流上实现ReadLine()的最有效方法是什么?》经验,为你挑选了1个好方法。

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

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

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

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

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



1> configurator..:

它可能是.在顺序方面,它只通过每个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();
    }
}

或类似的东西.

(警告:代码未经过测试,并且按原样提供,没有任何明示或暗示的保证.如果此程序证明有缺陷或毁坏地球,您将承担所有必要的维修,修理或更正的费用.)

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有