Wie man eine Datei effizient Zeile für Zeile in GO liest

  1. Paket und notwendige Importe
  2. Lesen Zeile für Zeile in Go
  3. Vollständiger Code zum Lesen einer Datei Zeile für Zeile in Go
  4. Konfigurieren Sie das Scanner-Verhalten in Go

Datei I/O, insbesondere das Lesen und Schreiben von Dateien ist eine ziemlich verbreitete Funktionalität von Programmiersprachen. Häufig müssen Sie eine Datei Zeile für Zeile lesen. GO stellt das Paket bufio zur Verfügung, das im wesentlichen gepuffertes I/O implementiert. bufio stellt hilfreiche Typen und Funktionen zur Verfügung, insbesondere zum Lesen und Schreiben von Textdateien.

Paket und notwendige Importe

package main

import(
    "fmt"
    "bufio"
    "log"
    "os"
)

Wir werden mehrere Importe aus der GO Standardbibliothek benötigen:-

  • os - für eine plattformunabhängige Schnittstelle zur OS-Funktionalität
  • fmt - Implementierung formatierter E/A-Funktionalität
  • log - Standard-Logging-Paket
  • bufio - unterstützt gepufferte E/A

Lesen Zeile für Zeile in Go

Bevor die Datei gelesen werden kann, muss sie zunächst mit der Funktion os.Open() geöffnet werden, die einen Zeigertyp auf die Datei zurückgibt. Die im Codeschnipsel gezeigte Datei test.txt muss vorher existieren (geben Sie den Pfad zu dem Ort an, an dem sich Ihre Datei befindet).

Die Funktion bufio.NewScanner(file) gibt einen Scannertyp zurück, der über Funktionen verfügt, die das Lesen der Datei unterstützen.

Um die Datei Zeile für Zeile durchzulesen, müssen wir auf dem neuen Scanner zwei Methoden verwenden - Scan, die den Scanner zum neuen Token (in diesem Fall die neue Zeile) weiterleitet, und Text (oder Byte), die das letzte Token liest, das beim Aufruf von Scan erzeugt wurde.

Wenn beim Lesen der Datei Fehler aufgetreten sind, können diese durch einen Aufruf der Methode Err() auf dem neuen Scanner behandelt werden, die den ersten nicht End of File-Fehler zurückgibt, auf den der Scanner stößt.


func main(){
    // open the file
    file, err := os.Open("test.txt")

    //handle errors while opening
    if err != nil {
        log.Fatalf("Error when opening file: %s", err)
    }


    fileScanner := bufio.NewScanner(file)

    // read line by line
    for fileScanner.Scan() {
        fmt.Println(fileScanner.Text())
    }
    // handle first encountered error while reading
    if err := fileScanner.Err(); err != nil {
        log.Fatalf("Error while reading file: %s", err)
    }

    file.Close()
}

Vollständiger Code zum Lesen einer Datei Zeile für Zeile in Go

Der komplette Code in main.go zum zeilenweisen Lesen einer Datei ist unten angegeben.

Sie müssen tippen:

    $ go run main.go

eingeben, um das Programm im Terminal auszuführen.


package main

import (
    "bufio"
    "fmt"
    "log"
    "os"
)

func main() {
    // open the file
    file, err := os.Open("test.txt")

    //handle errors while opening
    if err != nil {
        log.Fatalf("Error when opening file: %s", err)
    }

    fileScanner := bufio.NewScanner(file)

    // read line by line
    for fileScanner.Scan() {
        fmt.Println(fileScanner.Text())
    }
    // handle first encountered error while reading
    if err := fileScanner.Err(); err != nil {
        log.Fatalf("Error while reading file: %s", err)
    }

    file.Close()
}

Konfigurieren Sie das Scanner-Verhalten in Go

Der “Scanner”-Typ hat eine “Split”-Funktion, die eine SplitFunc Funktion akzeptiert, um zu bestimmen, wie der Scanner die gegebene Byte-Scheibe aufteilt. Die Standardeinstellung von SplitFunc ist die ScanLines, die jede Zeile des Textes ohne die abschließende Zeilenendemarkierung zurückgibt.

Zum Beispiel könnten wir mit Wörtern splitten, wie im folgenden Code-Snippet gezeigt,


scanner.Split(bufio.ScanWords)  //configure how the scanner behaves

comments powered by Disqus