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

标签 file go replace

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

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

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

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

谢谢。

最佳答案

您可以使用 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() 返回的 slice 仅在下一次调用 .Scan(),但如果您选择这样做,那么我就不会费心使用扫描仪了。

就其值(value)而言,现在将 3MB 大小的文件加载到通用计算机上实际上并不是一个坏主意,如果它大一个数量级,我只会三思而后行。使用带分隔符的 bytes.Split 几乎肯定会更快。

关于file - 如何使用 Go 字节有效地替换两个字符串分隔符之间出现的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44067829/

相关文章:

json - 在 Golang 中解析 JSON 数据

linux - Hook Linux 键盘事件

java - 如何将 java.util.logging 重定向到文件?

file - VBA 列出目录中的文件理解

r - 使用 R 扫描多个文件中的字符串

go - 使用 Go http 客户端时出现 404

c - 将文本添加到 C 文件中

python - 将双引号之间的空格替换为下划线

javascript - 用缩略图 + 视频链接替换嵌入或 iframe youtube 视频

快速查找和更改属性字符串中的范围