2017-06-13 116 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

是的..我試圖避免這一點..但我想這是唯一的選擇。謝謝! –

相關問題