我有一个平面文件,其中包含 339276 行文本,大小为 62.1 MB。我试图读取所有行,根据我拥有的一些条件解析它们,然后将它们插入到数据库中。我最初尝试使用 bufio.Scan() 循环和 bufio.Text() 来获取该行,但我的缓冲区空间不足。我改用 bufio.ReadLine/ReadString/ReadByte(我尝试了每个)并且每个都遇到了同样的问题。我没有足够的缓冲空间。我尝试使用 read 并设置缓冲区大小,但正如文档所说,它实际上是一个可以变小但永远不会大于 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)我很茫然。要么我不完全了解缓冲区的工作原理,要么我不了解其他东西。谢谢阅读。
3 回答
30秒到达战场
TA贡献1828条经验 获得超6个赞
在我看来,这个变体readLines比建议的 peterSO 更短更快
func readLines(filename string) (map[int]string, error) {
lines := make(map[int]string)
data, err := ioutil.ReadFile(filename)
if err != nil {
return nil, err
}
for n, line := range strings.Split(string(data), "\n") {
lines[n] = line
}
return lines, nil
}
- 3 回答
- 0 关注
- 163 浏览
添加回答
举报
0/150
提交
取消