在Golang中读取非常大的文件

时间:2015-04-04 02:13:44

标签: file go

我目前正在尝试读取包含200多列和1000多行的文件。我使用以下代码:

var result []string

file, err := os.Open("t8.txt")
if (err != nil) {
  fmt.Println(err)
}
defer file.Close()
scan := bufio.NewScanner(file)
for scan.Scan() {
  result = append(result, scan.Text())

}


fmt.Println(scan.Err()) //token too long

然而,当我打印出结果时,我得到的只是第一行,因为它说令牌太长了。当我在较小的文件上尝试它时,它工作正常。 Golang有没有办法在大文件中扫描?

1 个答案:

答案 0 :(得分:5)

正如@Dave C在评论中已经指出的那样,你遇到了MaxScanTokenSize = 64 * 1024

要解决这个限制,请使用bufio.Reader,它具有适合您案例的ReadString(delim byte)方法。

从Scanner go doc(特别是最后一句):

  

扫描仪提供了一个方便的界面来读取数据,如a   换行符分隔的文本行文件。连续调用Scan   方法将逐步执行文件的“标记”,跳过字节   令牌之间。令牌的规范由拆分定义   SplitFunc类型的函数;默认的拆分功能打破了   输入到线路终端剥离的行。分割功能是   在此包中定义,用于将文件扫描为行,字节,   UTF-8编码的符文和空格分隔的单词。客户可能会改为   提供自定义拆分功能。

     

扫描在EOF,第一个I / O错误或令牌时无法恢复   太大而无法放入缓冲区。当扫描停止时,读者可能会   任意地远远超过最后一个标记。需要更多的程序   控制错误处理或大型令牌,或必须按顺序运行   在阅读器上扫描,应该使用bufio.Reader。