2017-06-13 4 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)) 

ラインを読むための別の方法は、あなたがリーダーを使用し、その後

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

のように特定のバイトにジャンプするfd.Seek(64,0)を使用することができ行を読んでください。

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

ええ..私はそれを避けようとしていた..しかし、私はthats唯一のオプションだと思います。ありがとう! –

関連する問題