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
Libérer: 2024-11-06 04:15:02
original
421 Les gens l'ont consulté

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
}
Copier après la connexion

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()
}
Copier après la connexion

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)
    }
}
Copier après la connexion

Sortie :

--SCANNER, start: 0
Pos: 7, Scanned: first
Pos: 14, Scanned: second
Pos: 20, Scanned: third
Pos: 26, Scanned: fourth
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal