首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Go中逐行读取文本文件,当某些行足够长时会导致"bufio.Scanner: token too long“错误?

如何在Go中逐行读取文本文件,当某些行足够长时会导致"bufio.Scanner: token too long“错误?
EN

Stack Overflow用户
提问于 2014-01-15 05:24:29
回答 3查看 16.1K关注 0票数 23

我有一个文本文件,其中每一行代表一个JSON对象。我在Go中用一个简单的for循环处理这个文件:

代码语言:javascript
运行
复制
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来说太大但通常不是不安全大小的行时,是否有另一种方法可以完全采用?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-15 05:29:29

来自the package docs

需要对错误处理或大型标记进行更多控制的

程序,或者必须在阅读器上运行顺序扫描的程序,应该改用bufio.Reader。

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

票数 24
EN

Stack Overflow用户

发布于 2016-05-26 16:28:00

您还可以执行以下操作:

代码语言:javascript
运行
复制
scanner := bufio.NewScanner(file)
buf := make([]byte, 0, 64*1024)
scanner.Buffer(buf, 1024*1024)
for scanner.Scan() {
    // do your stuff
}

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

票数 30
EN

Stack Overflow用户

发布于 2014-01-15 14:02:35

你肯定不想一开始就逐行阅读。你为什么不这样做:

代码语言:javascript
运行
复制
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"...

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21124327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档