我正在解析一个非常大的记录文件(每行一个,每个都有不同的长度),我想跟踪我在文件中读取的字节数,以便我可以在失败的事件。
我写了以下内容:
using (TextReader myTextReader = CreateTextReader())
{
string record = myTextReader.ReadLine();
bytesRead += record.Length;
ParseRecord(record);
}
但是这不起作用,因为ReadLine()
会删除行中的任何CR / LF字符。此外,一行可以由CR,LF或CRLF字符终止,这意味着我不能只将{1}添加1。
是否有一种简单的方法来获取实际的行长度,或者我是否根据粒度bytesRead
操作编写了自己的ReadLine()
方法?
答案 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);
// ...
}