如何使用Go字节有效地替换两个字符串分隔符之间的字符串出现?
例如,我的平面文件(3Mb)内容类似于:
Lorem START ipsum END dolor sit amet, START adipiscing END elit.
Ipsum dolor START sit END amet, START elit. END
.....
我想替换START
和END
分隔符之间的所有货币。就像我的文件大小是3Mb一样,将整个内容加载到内存中是个坏主意。
感谢。
答案 0 :(得分:4)
您可以将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()
会返回一个仅在下一次调用.Scan()
之前有效的切片,但是如果您选择这样做,那么我就不会为扫描仪而烦恼。
对于它的价值,3MB大小的文件实际上并不是现在加载到通用计算机上的坏主意,如果它的数量级要大一个数量级,我只会三思而后行。 1}}与分隔符一起使用几乎肯定会更快。