我有一个文本文件,其中每一行代表一个JSON对象。我在Go中用一个简单的for
循环处理这个文件:
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
来说太大但通常不是不安全大小的行时,是否有另一种方法可以完全采用?
发布于 2014-01-15 05:29:29
需要对错误处理或大型标记进行更多控制的
程序,或者必须在阅读器上运行顺序扫描的程序,应该改用bufio.Reader。
看起来首选的解决方案是bufio.Reader.ReadLine。
发布于 2016-05-26 16:28:00
您还可以执行以下操作:
scanner := bufio.NewScanner(file)
buf := make([]byte, 0, 64*1024)
scanner.Buffer(buf, 1024*1024)
for scanner.Scan() {
// do your stuff
}
scanner.Buffer()的第二个参数设置最大令牌大小。在上面的示例中,只要所有行都不大于1MB,您就可以扫描文件。
发布于 2014-01-15 14:02:35
你肯定不想一开始就逐行阅读。你为什么不这样做:
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"...
}
https://stackoverflow.com/questions/21124327
复制相似问题