2017-06-13 39 views
1

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

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

然而,这只是让我读46个字节行英寸 有什么办法读取整个行,直到换行?

感谢

更新:

我刚刚创建持有结构的偏移量和线路长度..应在开始这样做了..我的坏

回答

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)) 
+0

我不得不退一步文件即时通讯目前在读,所以我不能随便丢弃接下来的n个字节。有时我必须跳回到文件的顶部。你可以放一个负数放弃吗? –

+0

不,但是如果你需要的话,你可以使用'file.seek()'并创建另一个'bufio.Reader'。 – Motakjuq

+0

是的..我试图避免这一点..但我想这是唯一的选择。谢谢! –

相关问题