如何使用Go字节有效地替换两个字符串分隔符之间的字符串出现?

时间:2017-05-19 10:35:39

标签: file go replace

如何使用Go字节有效地替换两个字符串分隔符之间的字符串出现?

例如,我的平面文件(3Mb)内容类似于:

Lorem START ipsum END dolor sit amet, START adipiscing END elit.
Ipsum dolor START sit END amet, START elit. END
.....

我想替换STARTEND分隔符之间的所有货币。就像我的文件大小是3Mb一样,将整个内容加载到内存中是个坏主意。

感谢。

1 个答案:

答案 0 :(得分:4)

您可以将bufio.Scannerbufio.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大小的文件实际上并不是现在加载到通用计算机上的坏主意,如果它的数量级要大一个数量级,我只会三思而后行。