Comment lire efficacement un fichier ligne par ligne dans GO

  1. Paquet et importations nécessaires
  2. Lecture ligne par ligne en go
  3. Code complet pour lire un fichier ligne par ligne en Go
  4. Configurer le comportement du Scanner dans Go

Les entrées/sorties de fichiers, en particulier la lecture et l’écriture de fichiers, sont une fonctionnalité assez courante des langages de programmation. Souvent, vous devez lire un fichier ligne par ligne. GO fournit le paquet bufio qui implémente essentiellement des I/O bufférisées. Le bufio fournit des types et des fonctions utiles, en particulier pour lire et écrire dans des fichiers texte.

Paquet et importations nécessaires

package main

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

Nous aurons besoin de plusieurs importations de la GO bibliothèque standard:-

  • os - pour une interface indépendante de la plate-forme vers les fonctionnalités du système d’exploitation
  • fmt - mise en œuvre d’une fonctionnalité d’E/S formatée
  • log - paquet de journalisation standard
  • bufio - prend en charge les E/S en mémoire tampon

Lecture ligne par ligne en go

Avant de lire le fichier, il doit d’abord être ouvert à l’aide de la fonction os.Open() qui retourne un type de pointeur vers le fichier. Le fichier test.txt indiqué dans l’extrait de code doit exister au préalable (mettez le chemin d’accès à l’endroit où se trouve votre fichier).

La fonction bufio.NewScanner(file) retourne un type de scanner qui a des fonctions qui permettent de lire le fichier.

Pour lire le fichier ligne par ligne, nous devons utiliser deux méthodes sur le nouveau Scanner - Scan, qui fait avancer le scanner vers le nouveau jeton (dans ce cas la nouvelle ligne) et Text(ou Octet) qui lit le jeton le plus récent qui a été généré lorsque Scan a été appelé.

Si des erreurs ont été rencontrées lors de la lecture du fichier, elles peuvent être traitées par un appel à la méthode Err() sur le nouveau Scanner qui renverra la première erreur non End of File rencontrée par le 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()
}

Code complet pour lire un fichier ligne par ligne en Go

Le code complet dans main.go pour lire un fichier ligne par ligne est fourni ci-dessous.

Vous devez taper:

    $ go run main.go

pour exécuter le programme dans le terminal.


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()
}

Configurer le comportement du Scanner dans Go

Le type Scanner a une fonction Split qui accepte une fonction SplitFunc pour déterminer comment le scanner va diviser la tranche d’octets donnée. La fonction par défaut SplitFunc est la fonction ScanLines qui retourne chaque ligne du texte, dépouillée du marqueur de fin de ligne.

Par exemple, nous pourrions diviser en utilisant des mots comme indiqué dans le code ci-dessous,


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