3

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

我写了以下内容:

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

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

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

4

4 回答 4

2

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

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

我会简单地计算读取的行数。

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

于 2010-06-03T06:24:41.100 回答
1

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

只存储读取的行数,然后在恢复时跳过那么多行怎么样?我想这都是关于不处理这些行,不一定要避免从流中读取它们。

于 2010-06-03T06:23:23.093 回答
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}");
        }
于 2021-02-04T13:07:35.783 回答
0

想想看,我可以使用 aStreamReader并获取底层流的当前位置,如下所示。

using (StreamReader myTextReader = CreateStreamReader())
{
    stringRecord = myTextReader.ReadLine();
    bytesRead += myTextReader.BaseStream.Position;
    ParseRecord(record);
    // ...
}
于 2010-06-03T06:12:10.333 回答