猿问

当某些行足够长导致“bufio.Scanner: token too long”错误时

我有一个文本文件,其中每一行代表一个 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:令牌太长”。


有没有一种简单的方法可以增加可读的最大行大小NewScanner?或者,当需要读取过大NewScanner但通常已知不是不安全大小的行时,您是否可以完全采用另一种方法?


HUH函数
浏览 952回答 3
3回答

斯蒂芬大帝

从包文档:需要对错误处理或大令牌进行更多控制,或者必须在读取器上运行顺序扫描的程序,应改用 bufio.Reader。看起来首选的解决方案是 bufio.Reader.ReadLine。

蝴蝶刀刀

你也可以这样做:scanner := bufio.NewScanner(file)buf := make([]byte, 0, 64*1024)scanner.Buffer(buf, 1024*1024)for scanner.Scan() {    // do your stuff}Scanner.Buffer() 的第二个参数设置最大令牌大小。在上面的示例中,只要没有任何行大于 1MB,您就可以扫描文件。

子衿沉夜

您肯定不想首先逐行阅读。你为什么不这样做: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"...}
随时随地看视频慕课网APP

相关分类

Go
我要回答