2017-06-13 6 views
1

J'utilise os.ReadAt() pour lire certaines lignes dans un fichier csv/tsv. Cependant, je ne sais pas combien d'octets sont dans cette rangée, j'ai juste besoin de lire la ligne en commençant par le décalage d'octets que je spécifie jusqu'à la nouvelle ligne.Lecture d'une ligne d'un fichier commençant à l'octet offset jusqu'à la nouvelle ligne

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

Cependant, cela ne me permet de lire 46 octets de la ligne. Est-il possible de lire toute la ligne jusqu'à ce que la nouvelle ligne?

Merci

Mise à jour:

Je viens de créer une structure qui tient le décalage et la longueur de la ligne .. Si avez fait cela au début .. mon mauvais

Répondre

1

Une façon est d'utiliser la bufio pqt. Un exemple de ceci est le suivant:

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

Une autre façon de lire la ligne, vous pouvez utiliser fd.Seek(64,0) pour passer à un octet spécifique comme

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

et utiliser ensuite le lecteur lire la ligne.

reader := bufio.NewReader(fd) 

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

je dois remonter dans le fichier Im en train de lire, donc je ne peux pas simplement ignorer les octets n prochains. Je dois parfois revenir en haut du fichier. Pouvez-vous mettre un nombre négatif à la défausse? –

+0

Non, mais vous pouvez utiliser 'file.seek()' et créer un autre 'bufio.Reader' si vous en avez besoin. – Motakjuq

+0

Ouais .. J'essayais d'éviter ça .. mais je suppose que c'est la seule option. Merci! –