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é.
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.
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() }
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) } }
--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!