我最近遇到了这样一个问题:如何从CSV文件中读取,对每行进行一些转换以及写入HTTP请求。
我面临的问题是如何从逐行读取器转换为字节读取器,逐行读取器返回任意数量的字节(如扫描仪),字节读取器在每次调用Read时返回固定数量的字节()。
我想出的最好的解决方案是建立一个自定义的io.Reader,它将从扫描器读取并在不适合的地方在本地缓存字节。然后,在下次调用Read()时将返回缓冲的字节。
这是我想出的: https://gist.github.com/paulsc/6a0bf30a2a8d898f7a8086aedf6af1e1
直觉上,这感觉像是错误的解决方案,因为代码似乎是一个相当底层的解决方案,可能已经在标准库中了。
是否有更好的方法,更惯用的标准go组件呢?
答案 0 :(得分:0)
一种简单的方法是使用io.Pipe
。
func ScannerToReader(scanner *bufio.Scanner) io.Reader {
reader, writer := io.Pipe()
go func() {
defer writer.Close()
for scanner.Scan() {
writer.Write(scanner.Bytes())
}
}()
return reader
}