我目前正在尝试读取包含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有没有办法在大文件中扫描?
答案 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。