为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
HUH函数 2021-07-13 13:09:33
我有一个文本文件,其中每一行代表一个 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但通常已知不是不安全大小的行时,您是否可以完全采用另一种方法?
查看完整描述

3 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

包文档

需要对错误处理或大令牌进行更多控制,或者必须在读取器上运行顺序扫描的程序,应改用 bufio.Reader。

看起来首选的解决方案是 bufio.Reader.ReadLine。


查看完整回答
反对 回复 2021-07-19
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

你也可以这样做:


scanner := bufio.NewScanner(file)

buf := make([]byte, 0, 64*1024)

scanner.Buffer(buf, 1024*1024)

for scanner.Scan() {

    // do your stuff

}

Scanner.Buffer() 的第二个参数设置最大令牌大小。在上面的示例中,只要没有任何行大于 1MB,您就可以扫描文件。


查看完整回答
反对 回复 2021-07-19
?
子衿沉夜

TA贡献1828条经验 获得超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"...


}


查看完整回答
反对 回复 2021-07-19
  • 3 回答
  • 0 关注
  • 950 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信