Wie man eine Datei effizient Zeile für Zeile in GO liest
- Paket und notwendige Importe
- Lesen Zeile für Zeile in Go
- Vollständiger Code zum Lesen einer Datei Zeile für Zeile in Go
-
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ätfmt
- Implementierung formatierter E/A-Funktionalitätlog
- Standard-Logging-Paketbufio
- 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