Leggi in modo efficiente un file linea per linea in GO
- Pacchetto e importazioni necessarie
- Leggi linea per linea in Go
- Completa il codice per leggere un file linea per linea in Go
-
Configura il comportamento dello
Scanner
in Go
Il file I/O
, in particolare la lettura e la scrittura su file, è una funzionalità abbastanza comune dei linguaggi di programmazione. Spesso è necessario leggere un file linea per linea. GO fornisce il pacchetto bufio
che fondamentalmente implementa l’I/O
bufferizzato. bufio
fornisce tipi e funzioni utili in particolare per la lettura e la scrittura su file di testo.
Pacchetto e importazioni necessarie
package main
import(
"fmt"
"bufio"
"log"
"os"
)
Avremo bisogno di diverse importazioni dalla GO libreria standard: -
os
- per un’interfaccia indipendente dalla piattaforma con le funzionalità del sistema operativofmt
- implementazione della funzionalità I/O formattatalog
- pacchetto di registrazione standardbufio
- supporta I/O bufferizzato
Leggi linea per linea in Go
Prima di leggere il file, è necessario aprirlo usando la funzione os.Open()
che restituisce un tipo di puntatore al file. Il file test.txt
mostrato nello snippet di codice deve esistere in anticipo (inserisci il percorso dove si trova il tuo file).
La funzione bufio.NewScanner(file)
restituisce un tipo di scanner che ha funzioni che supportano la lettura attraverso il file.
Per leggere linea per linea sul file, dobbiamo usare due metodi sul nuovo Scanner
- Scansione
, che fa avanzare lo scanner al nuovo token (in questo caso la nuova linea), e Text
(o Byte
) che legge il token più recente che è stato generato quando è stato chiamato Scan
.
Se si sono verificati errori durante la lettura del file, possono essere gestiti da una chiamata al metodo Err()
sul nuovo Scanner
che restituirà il primo errore non di Fine File incontrato dallo Scanner
.
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()
}
Completa il codice per leggere un file linea per linea in Go
Il codice completo in main.go
per leggere un file linea per linea è fornito di seguito.
Devi digitare:
$ go run main.go
per eseguire il programma nel terminale.
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()
}
Configura il comportamento dello Scanner
in Go
Il tipo Scanner
ha una funzione Split
che accetta una funzione SplitFunc
per determinare come lo scanner dividerà la data slice di byte. L’impostazione predefinita SplitFunc
è la ScanLines
che restituisce ogni linea del testo, privata del marcatore di fine linea.
Ad esempio, potremmo dividere utilizzando le parole come mostrato nello snippet di codice di seguito,
scanner.Split(bufio.ScanWords) //configure how the scanner behaves