File 读取非常大的文件

File 读取非常大的文件,file,go,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

我正在尝试读取一个包含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

然而,当我打印出结果时,我得到的只是第一行,因为它说令牌太长了。当我在较小的文件上尝试时,效果很好。有什么方法可以扫描大文件吗

正如@Dave C在您遇到的MaxScanTokenSize=64*1024的评论中指出的那样

要绕过这个限制,请使用bufio.Reader,它有一个ReadString(delim byte)方法,似乎适合您的情况

从扫描仪go文档(特别是最后一句话):

扫描仪提供了一个方便的接口来读取数据,例如 以换行符分隔的文本行的文件。连续调用扫描 方法将逐步遍历文件的“令牌”,跳过字节 在代币之间。令牌的规范由拆分定义 SplitFunc型函数;默认的拆分函数会中断 输入到剥离线路终端的线路中。拆分函数是 在此包中定义,用于将文件扫描为行、字节、, UTF-8编码的符文和空格分隔的单词。而客户可以 提供自定义拆分功能

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


永远不要忽略
错误
返回值!(从
os.Open
打开
scan.Err()
并在循环后检查)。我不知道他们也有一个scan.Err(),但现在我看到它返回“token too long”。当我想读取整个文件时,有时我只使用,比如.Yes。因此,您要么需要使用较小的标记(例如,拆分函数对列进行标记化),要么使用不同的读取方法。顺便说一句,您是希望/需要内存中的全部内容,还是只进行每行处理?