Wie lese ich eine Datei ab einer bestimmten Zeilennummer in Go mit einem Scanner?

Barbara Streisand
Freigeben: 2024-11-08 10:01:02
Original
429 Leute haben es durchsucht

How to Read a File Starting from a Specific Line Number in Go using a Scanner?

Wie lese ich eine Datei ab einer bestimmten Zeilennummer mit einem Scanner?

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:

1. Erweiterbarer Scanner mit Split-Funktion

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()
}
Nach dem Login kopieren

2. Mit bufio.Reader

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
}
Nach dem Login kopieren

Testen der Lösungen

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
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage