我正在编写小型日志解析器,该解析器应该在文件中找到一些标签。 文件很大(512mb),具有以下结构:
[2018.07.10 00:30:03:125] VersionInfo\886
...some data...
[2018.07.10 00:30:03:109][TraceID: 8HRWSI105YVO91]->IncomingTime\16
...some data...
[2018.07.10 00:30:03:109][TraceID: 8HRWSI105YVO91]->IncomingData\397
...some data...
[2018.07.10 00:30:03:749][TraceID: 8HRWSI105YVO91]->OutgoingData\26651
...somedata...
每个块IncomingTime, IncomingData, OutgoingData, etc.
在块886, 16, 397, 26651
的末尾具有块大小(字符计数,而不是字节)。有些块非常大,没有大缓冲区就无法读取(如果我使用bufio)。我想使用file.Seek
跳过不必要的块。
问题在于file.Seek
需要字节长度,并且我只计算字符数(块可能具有带两字节字符的unicode数据)。有机会跳过使用字符计数的块吗?
答案 0 :(得分:2)
问题是文件.Seek需要字节长度,我只计算字符数(块可能具有带两个字节字符的unicode数据)。有机会跳过使用字符计数的块吗?
这实际上是不可能的。正如您描述的文件格式,以下两种情况都是可能的:
C:\DEVENV\glassfish5\glassfish\config
如果您刚刚读过换行符,并且知道需要读取一个字符,则知道它在1到2个字节之间(UTF-8字符甚至可以增加到4个字节),但不是,然后盲目地启动转发一些字节而不检查中间数据将不起作用。病理情况是一个较大的块,其中前半部分包含许多多字节字符,后半部分具有恰好看起来像您的输入标头之一的文本。
使用这种文件格式,您一次只能读取一个字符。