两字节字符的文件查找

我正在编写小型日志解析器,该解析器应该在文件中找到一些标签。文件很大(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数据)。有机会跳过使用字符计数的块吗?


ITMISS
浏览 254回答 1
1回答

神不在的星期二

问题是文件.Seek需要字节长度,而我只有字符计数(块可能具有带两个字节字符的unicode数据)。有机会跳过使用字符计数的块吗?这实际上是不可能的。正如您描述的文件格式,以下两种情况都是可能的:...VersionInfo\1[ 20 ]...VersionInfo\1[ C2 A0 ]如果您刚刚读过换行符,并且知道需要读取一个字符,那么您知道它在1到2个字节之间(UTF-8字符甚至可以增加到4个字节),但不是一个,然后盲目地启动一些数字字节数而不检查中间数据将不起作用。病理情况是一个较大的块,其中前半部分包含许多多字节字符,后半部分具有恰好看起来像您的输入标头之一的文本。使用这种文件格式,您不得不一次读取一个字符。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go