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

我写了以下内容:

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

但是,这是不起作用的 ReadLine() 剥离行中的任何CR/LF字符。此外,可以通过CR,LF或CRLF字符终止行,这意味着我不能仅将1添加到 bytesRead.

有没有简单的方法来获得实际的线长度,还是我自己写的 ReadLine() 用颗粒状的方法 Read() 操作?

有帮助吗?

解决方案

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

从本质上讲,如果不编写自己的流程阅读器,就无法做到这一点。但是你真的需要吗?

我只需计算读取的行数。

当然,这意味着要定位到特定的线路,您需要读取n行而不是只是寻求偏移,但是这是怎么回事?您是否确定性能是不可接受的?

其他提示

Textreader读取字符串,这是字符,[根据编码]的字符不等于字节。

如何存储读取的线路数,然后在恢复时跳过很多行?我想这全都是关于不处理这些行,不一定避免从流中读取它们。

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

using (StreamReader myTextReader = CreateStreamReader())
{
    stringRecord = myTextReader.ReadLine();
    bytesRead += myTextReader.BaseStream.Position;
    ParseRecord(record);
    // ...
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top