Leggi in modo efficiente un file linea per linea in GO

  1. Pacchetto e importazioni necessarie
  2. Leggi linea per linea in Go
  3. Completa il codice per leggere un file linea per linea in Go
  4. 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 operativo
  • fmt - implementazione della funzionalità I/O formattata
  • log - pacchetto di registrazione standard
  • bufio - 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