从字节偏移量开始读取一行文件,直到新行

时间:2017-06-13 18:27:40

标签: file go byte reader

我正在使用os.ReadAt()来读取csv / tsv文件中的某些行。但是,我不知道该行中有多少字节,我只需要读取从指定的字节偏移开始的行,直到换行。

buffer = make([]byte, 46)
os.ReadAt(buffer, 64) //Read at byte offset 64 and put contents in buffer

然而,这只允许我读取该行的46个字节。 有没有办法在换行前阅读整行?

由于

更新

我只是创建一个包含偏移量和行长度的结构。应该在开始时做到这一点..我的不好

1 个答案:

答案 0 :(得分:1)

一种方法是使用bufio pkg。这方面的一个例子如下:

fd, err := os.Open("your_file.csv")
if err != nil { //error handler
    log.Println(err)
    return
}

reader := bufio.NewReader(fd) // creates a new reader

_, err = reader.Discard(64) // discard the following 64 bytes
if err != nil { // error handler
    log.Println(err)
    return
}

// use isPrefix if is needed, this example doesn't use it
// read line until a new line is found
line, _, err := reader.ReadLine() 
if err != nil { // error handler
    log.Println(err)
    return
}
fmt.Println(string(line))

读取该行的另一种方法是,您可以使用fd.Seek(64,0)跳转到特定的字节,如

 
_, err = fd.Seek(64, 0)  // Set the current position for the fd
if err != nil { // error handler
    log.Println(err)
    return
}

然后使用读者阅读该行。

 
reader := bufio.NewReader(fd)

line, _, err := reader.ReadLine()
if err != nil {
    log.Println(err)
    return
}
fmt.Println(string(line))