我有一个文本文件,其中每一行代表一个JSON对象。我正在使用简单的for
循环在Go中处理此文件:
scanner := bufio.NewScanner(file)
for scanner.Scan() {
jsonBytes = scanner.Bytes()
var jsonObject interface{}
err := json.Unmarshal(jsonBytes, &jsonObject)
// do stuff with "jsonObject"...
}
if err := scanner.Err(); err != nil {
log.Fatal(err)
}
当此代码到达具有特别大的JSON字符串(~67kb)的行时,我收到错误消息“bufio.Scanner:token too long”。
是否有一种简单的方法来增加NewScanner
可读的最大行数?或者,当需要读取对于NewScanner
来说太大但通常不是不安全大小的行时,你可以采取另一种方法吗?
答案 0 :(得分:16)
需要更多控制错误处理或大型令牌的程序, 或者必须在阅读器上运行顺序扫描,应该使用bufio.Reader 代替。
看起来首选的解决方案是bufio.Reader.ReadLine。
答案 1 :(得分:12)
你也可以这样做:
Container
scanner.Buffer()的第二个参数设置最大令牌大小。在上面的示例中,只要没有任何行大于1MB,您就可以扫描文件。
答案 2 :(得分:3)
你肯定不想一开始就逐行阅读。你为什么不这样做:
d := json.NewDecoder(file)
for {
var ob whateverType
err := d.Decode(&ob)
if err == io.EOF {
break
}
if err != nil {
log.Fatalf("Error decoding: %v", err)
}
// do stuff with "jsonObject"...
}