如何使用 Go 字节有效地替换两个字符串分隔符之间的字符串出现?
例如我的平面文件 (3Mb) 内容类似于:
Lorem START ipsum END dolor sit amet, START adipiscing END elit.
Ipsum dolor START sit END amet, START elit. END
.....
Run Code Online (Sandbox Code Playgroud)
我想替换START
和END
分隔符之间的所有 occurrencies 。就像我的文件大小是 3Mb 一样,将整个内容加载到内存中是个坏主意。
谢谢。
您可以使用bufio.Scanner
with 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
}
}
Run Code Online (Sandbox Code Playgroud)
这将确保从文件中读取的数据量保持有界(这由 控制MaxScanTokenSize
)
请注意,如果您想使用多个 goroutine,则需要先复制数据,因为scanner.Bytes()
返回的切片仅在下一次调用之前有效.Scan()
,但是如果您选择这样做,那么我就不会打扰扫描仪了.
就其价值而言,现在在通用计算机上加载 3MB 大小的文件实际上并不是一个坏主意,如果它大一个数量级,我只会三思而后行。bytes.Split
与您的分隔符一起使用几乎肯定会更快。
归档时间: |
|
查看次数: |
225 次 |
最近记录: |