当一些行长到足以导致“bufio.Scanner:token too long”错误时,如何在Go中逐行读取文本文件?

时间:2014-01-14 21:24:29

标签: go

我有一个文本文件,其中每一行代表一个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来说太大但通常不是不安全大小的行时,你可以采取另一种方法吗?

3 个答案:

答案 0 :(得分:16)

来自the package docs

  

需要更多控制错误处理或大型令牌的程序,   或者必须在阅读器上运行顺序扫描,应该使用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"...

}