Maison >développement back-end >Golang >Comment reprendre la lecture d'un fichier à partir d'une ligne spécifique à l'aide du scanner dans Go ?

Comment reprendre la lecture d'un fichier à partir d'une ligne spécifique à l'aide du scanner dans Go ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-06 04:15:02424parcourir

How to Resume Reading a File from a Specific Line Using the Scanner in Go?

Lecture d'un fichier à partir d'un numéro de ligne spécifique à l'aide du scanner

Lorsque vous travaillez avec des fichiers, il est souvent nécessaire de reprendre la lecture d'un fichier à partir d'un numéro de ligne spécifique. Le type Scanner dans le package bufio peut être étendu pour prendre en charge cette fonctionnalité.

Fonction de division personnalisée

Le problème avec l'utilisation de Scanner réside dans son manque de capacités de positionnement de ligne. Cependant, nous pouvons créer un SplitFunc personnalisé, qui divise l'entrée en fonction du caractère de nouvelle ligne et renvoie le nombre de caractères lus pour maintenir la position du fichier.

func scanLinesWithPosition(data []byte, atEOF bool) (advance int, token []byte, err error) {
    advance, token, err = bufio.ScanLines(data, atEOF)
    pos += int64(advance)
    return
}

Ce SplitFunc incrémente une variable de position avec le nombre de caractères lus.

Scanner modifié

Ensuite, nous devons modifier le scanner pour utiliser notre SplitFunc personnalisé.

func withScannerAtPosition(input io.ReadSeeker, start int64) error {
    fmt.Println("--SCANNER, start:", start)
    if _, err := input.Seek(start, 0); err != nil {
        return err
    }
    scanner := bufio.NewScanner(input)
    scanner.Split(scanLinesWithPosition)

    for scanner.Scan() {
        fmt.Printf("Pos: %d, Scanned: %s\n", pos, scanner.Text())
    }
    return scanner.Err()
}

Exemple d'utilisation

Dans dans cet exemple, nous lisons un exemple de fichier et imprimons son contenu avec les numéros de ligne :

func main() {
    input := strings.NewReader("first\r\nsecond\nthird\nfourth")
    if err := withScannerAtPosition(input, 0); err != nil {
        fmt.Println("Scanner error:", err)
    }
}

Sortie :

--SCANNER, start: 0
Pos: 7, Scanned: first
Pos: 14, Scanned: second
Pos: 20, Scanned: third
Pos: 26, Scanned: fourth

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn