在Golang中读取非常大的文件

fre*_*lay 2 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
Run Code Online (Sandbox Code Playgroud)

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

Iam*_*NaN 5

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

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

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

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

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