如何计算TextReader.ReadLine()读取的字节数?

时间:2010-06-03 06:08:54

标签: c# .net readline textreader

我正在解析一个非常大的记录文件(每行一个,每个都有不同的长度),我想跟踪我在文件中读取的字节数,以便我可以在失败的事件。

我写了以下内容:

using (TextReader myTextReader = CreateTextReader())
{
    string record = myTextReader.ReadLine();
    bytesRead += record.Length;
    ParseRecord(record);
}

但是这不起作用,因为ReadLine()会删除行中的任何CR / LF字符。此外,一行可以由CR,LF或CRLF字符终止,这意味着我不能只将{1}添加1。

是否有一种简单的方法来获取实际的行长度,或者我是否根据粒度bytesRead操作编写了自己的ReadLine()方法?

4 个答案:

答案 0 :(得分:2)

获取基础流的当前位置无济于事,因为StreamReader将缓冲从流中读取的数据。

基本上,如果不编写自己的StreamReader,就无法做到这一点。但你真的需要吗?

我只计算读取的行数。

当然,这意味着要定位到特定的行,你需要读取N行而不是简单地寻找偏移量,但这有什么不对?你确定性能是不可接受的吗?

答案 1 :(得分:1)

TextReader读取字符串,这些字符串[取决于编码]不等于字节。

如何只是存储读取的行数,并在恢复时跳过那么多行?我想这就是不处理那些行,不一定避免从流中读取它们。

答案 2 :(得分:1)

如果你正在读取一个字符串,你可以使用正则表达式匹配并计算字符数。

        var regex = new Regex("^(.*)$", RegexOptions.Compiled | RegexOptions.Multiline);
        var matches = regex.Matches(text);
        var count = matches.Count;
        for (var matchIndex = 0; matchIndex < count; ++matchIndex)
        {
            var match = matches[matchIndex];
            var group = match.Groups[1];
            var value = group.Captures[0].Value;
            Console.WriteLine($"Line {matchIndex + 1} (pos={match.Index}): {value}");
        }

答案 3 :(得分:0)

考虑一下,我可以使用StreamReader并获取基础流的当前位置,如下所示。

using (StreamReader myTextReader = CreateStreamReader())
{
    stringRecord = myTextReader.ReadLine();
    bytesRead += myTextReader.BaseStream.Position;
    ParseRecord(record);
    // ...
}