Zunächst kann es schwierig sein, eine Datei Zeile für Zeile zu lesen und den Fortschritt darin zu speichern Gehen. Der Scanner aus dem bufio-Paket bietet keine Methoden für Zeilennummern. Hier sind jedoch mögliche Lösungen:
bufio.Scanner kann zur Positionserhaltung erweitert werden. Implementieren Sie eine Split-Funktion, die die Eingabe in Token (Zeilen) aufteilt und die gelesenen Bytes verfolgt. Das folgende Beispiel verwendet die integrierte Funktion bufio.ScanLines() als Basis und behält die Position (pos) mithilfe des erweiterten Rückgabewerts bei:
func withScanner(input io.ReadSeeker, start int64) error { if _, err := input.Seek(start, 0); err != nil { return err } scanner := bufio.NewScanner(input) pos := start scanLines := func(data []byte, atEOF bool) (advance int, token []byte, err error) { advance, token, err = bufio.ScanLines(data, atEOF) pos += int64(advance) return } scanner.Split(scanLines) for scanner.Scan() { fmt.Printf("Pos: %d, Scanned: %s\n", pos, scanner.Text()) } return scanner.Err() }
bufio.Reader können Sie eine Zeile mit ReadBytes() lesen, wobei „n“ als Trennzeichen verwendet wird. Das folgende Beispiel verarbeitet mehrere Zeilenabschlusssequenzen (rn) und entfernt sie aus der Lesezeile:
func withReader(input io.ReadSeeker, start int64) error { if _, err := input.Seek(start, 0); err != nil { return err } r := bufio.NewReader(input) pos := start for { data, err := r.ReadBytes('\n') pos += int64(len(data)) if err == nil || err == io.EOF { if len(data) > 0 && data[len(data)-1] == '\n' { data = data[:len(data)-1] } if len(data) > 0 && data[len(data)-1] == '\r' { data = data[:len(data)-1] } fmt.Printf("Pos: %d, Read: %s\n", pos, data) } if err != nil { if err != io.EOF { return err } break } } return nil }
Um die Lösungen zu testen, können Sie den Inhalt „firstrnsecondnthirdnfourth“ verwenden. als Eingabe mit sowohl einem sauberen Start (Start = 0) als auch einer Wiederaufnahmeposition (Start = 14). Die Ausgabe zeigt die Positionen und Lesezeilen an:
--SCANNER, start: 0 Pos: 7, Scanned: first Pos: 14, Scanned: second Pos: 20, Scanned: third Pos: 26, Scanned: fourth --READER, start: 0 Pos: 7, Read: first Pos: 14, Read: second Pos: 20, Read: third Pos: 26, Read: fourth --SCANNER, start: 14 Pos: 20, Scanned: third Pos: 26, Scanned: fourth --READER, start: 14 Pos: 20, Read: third Pos: 26, Read: fourth
Das obige ist der detaillierte Inhalt vonWie lese ich eine Datei ab einer bestimmten Zeilennummer in Go mit einem Scanner?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!