我有一个平面文件,其中包含339276行文本,大小为62.1 MB。我试图读取所有行,根据我所具有的某些条件解析它们,然后将它们插入数据库。
我最初尝试使用bufio.Scan()循环和bufio.Text()来获取行,但我的缓冲区空间不足。我切换到使用bufio.ReadLine / ReadString / ReadByte(我尝试了每种方法),并且每种方法都有相同的问题。我没有足够的缓冲区空间。
我尝试使用读取并设置缓冲区大小,但正如文档所述,它实际上可以使const变小,但不能大于64 * 1024字节。然后,我尝试使用File.ReadAt来设置起始姿势,并将其移动到每节中都无济于事。 如何将整个文件(逐行或一次读入)切成片,以便随后对行进行处理?
这是我尝试过的一些代码:
file, err := os.Open(feedFolder + value) handleError(err) defer file.Close() // fileInfo, _ := file.Stat() var linesInFile []string r := bufio.NewReader(file) for { path, err := r.ReadLine("\n") // 0x0A separator = newline linesInFile = append(linesInFile, path) if err == io.EOF { fmt.Printf("End Of File: %s", err) break } else if err != nil { handleError(err) // if you return error } } fmt.Println("Last Line: ", linesInFile[len(linesInFile)-1])
这是我尝试过的其他方法:
var fileSize int64 = fileInfo.Size() fmt.Printf("File Size: %d\t", fileSize) var bufferSize int64 = 1024 * 60 bytes := make([]byte, bufferSize) var fullFile []byte var start int64 = 0 var interationCounter int64 = 1 var currentErr error = nil for currentErr != io.EOF { _, currentErr = file.ReadAt(bytes, st) fullFile = append(fullFile, bytes...) start = (bufferSize * interationCounter) + 1 interationCounter++ } fmt.Printf("Err: %s\n", currentErr) fmt.Printf("fullFile Size: %s\n", len(fullFile)) fmt.Printf("Start: %d", start) var currentLine []string for _, value := range fullFile { if string(value) != "\n" { currentLine = append(currentLine, string(value)) } else { singleLine := strings.Join(currentLine, "") linesInFile = append(linesInFile, singleLine) currentLine = nil } }
我很茫然。我要么不完全了解缓冲区的工作方式,要么不了解其他内容。谢谢阅读。
bufio.Scan()并且bufio.Text()在一个循环中对我来说完美地适用于更大的文件,所以我想您的行数超出了缓冲区容量。然后
bufio.Scan()
bufio.Text()
path, err :=r.ReadLine("\n") // 0x0A separator = newline
func (b *bufio.Reader) ReadLine() (line []byte, isPrefix bool, err error)
isPrefix