使用两个字节字符查找文件

File seek with two-byte characters

我正在编写小型日志解析器,它应该可以在文件中找到一些标签。 文件很大 (512mb) 并具有以下结构:

[2018.07.10 00:30:03:125] VersionInfo6
...some data...
[2018.07.10 00:30:03:109][TraceID: 8HRWSI105YVO91]->IncomingTime
...some data...
[2018.07.10 00:30:03:109][TraceID: 8HRWSI105YVO91]->IncomingData7
...some data...
[2018.07.10 00:30:03:749][TraceID: 8HRWSI105YVO91]->OutgoingData651
...somedata...

每个块 IncomingTime, IncomingData, OutgoingData, etc. 在末尾 886, 16, 397, 26651 都有块大小(字符数,而不是字节数)。有些块非常大,没有大缓冲区就无法读取(如果我使用 bufio)。我想使用 file.Seek.

跳过不必要的块

问题是 file.Seek 需要字节长度,而我只有字符计数(块可能包含带有两个字节字符的 unicode 数据)。有没有机会使用字符数来跳过块?

The problem is that file.Seek needs bytes length and i've only characters count (block may have unicode data with two-byte charcters). Is there any chance to skip blocks using characters count?

这实际上是不可能的。正如您所描述的文件格式,以下两种都是可能的:

...VersionInfo
[ 20 ]
...VersionInfo
[ C2 A0 ]

如果你刚刚读过换行符并且你知道你需要读一个字符,你知道它在 1 到 2 个字节之间(UTF-8 字符甚至可以达到 4 个字节)但不知道是哪个,并且在不检查中间数据的情况下盲目地向前发射一些字节是行不通的。病理情况是一个更大的块,其中前半部分有许多 multi-byte 个字符,后半部分的文本恰好看起来像您的条目之一 headers.

使用这种文件格式,您必须一次读取一个字符。