如何使用 Go bytes 高效地替换两个字符串分隔符之间出现的字符串?
例如我的平面文件 (3Mb) 内容类似于:
Lorem START ipsum END dolor sit amet, START adipiscing END elit.
Ipsum dolor START sit END amet, START elit. END
.....
我想替换 START
和 END
分隔符之间的所有出现。就像我的文件大小是 3Mb 一样,将整个内容加载到内存中是个坏主意。
谢谢。
最佳答案
您可以使用 bufio.Scanner
与 bufio.ScanWords
,标记空白边界,并将非空白序列与您的定界符进行比较:
scanner := bufio.NewScanner(reader)
scanner.Split(bufio.ScanWords) // you can implement your own split function
// but ScanWords will suffice for your example
for scanner.Scan() {
// scanner.Bytes() efficiently exposes the file contents
// as slices of a larger buffer
if bytes.HasPrefix(scanner.Bytes(), []byte("START")) {
... // keep scanning until the end delimiter
}
// copying unmodified inputs is quite simple:
_, err := writer.Write( scanner.Bytes() )
if err != nil {
return err
}
}
这将确保从文件中读取的数据量保持在一定范围内(这由 MaxScanTokenSize
控制)
请注意,如果您想使用多个 goroutine,您需要先复制数据,因为 scanner.Bytes()
返回的 slice 仅在下一次调用 .Scan()
,但如果您选择这样做,那么我就不会费心使用扫描仪了。
就其值(value)而言,现在将 3MB 大小的文件加载到通用计算机上实际上并不是一个坏主意,如果它大一个数量级,我只会三思而后行。使用带分隔符的 bytes.Split
几乎肯定会更快。
关于file - 如何使用 Go 字节有效地替换两个字符串分隔符之间出现的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44067829/