Como ler eficientemente um arquivo linha por linha em GO

  1. Pacote e Importações Necessárias
  2. Ler linha por linha em Go
  3. Código completo para ler um arquivo linha a linha em Go
  4. Configurar o comportamento do Scanner em Go

O arquivo I/O, especificamente leitura e escrita em arquivos é uma funcionalidade bastante comum das linguagens de programação. Muitas vezes, você precisa ler um arquivo linha por linha. GO fornece o pacote bufio que basicamente implementa o buffered I/O. O bufio fornece tipos e funções úteis, particularmente para leitura e escrita de arquivos de texto.

Pacote e Importações Necessárias

package main

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

Vamos precisar de várias importações da GO biblioteca padrão:-

  • os - para uma interface independente de plataforma para a funcionalidade do sistema operacional
  • fmt - implementando a funcionalidade de E/S formatada
  • log - pacote padrão de extração
  • bufio - suporta E/S tamponadas

Ler linha por linha em Go

Antes de ler o arquivo, ele precisa primeiro ser aberto utilizando a função os.Open() que retorna um tipo de ponteiro para o arquivo. O arquivo test.txt mostrado no trecho de código precisa existir previamente (coloque o caminho para onde seu arquivo está).

A função bufio.NewScanner(file) retorna um tipo de scanner que possui funções que suportam a leitura através do arquivo.

Para ler linha por linha no arquivo, precisamos utilizar dois métodos no novo Scanner, que avança o scanner para o novo token (neste caso a nova linha), e Text (ou Byte) que lê o token mais recente que foi gerado quando o Scan foi chamado.

Se algum erro foi encontrado ao ler o arquivo, ele pode ser manipulado por uma chamada para o método Err() no novo Scanner que retornará o primeiro erro não final do arquivo encontrado pelo 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()
}

Código completo para ler um arquivo linha a linha em Go

O código completo em main.go para ler um arquivo linha por linha é fornecido abaixo.

Você precisa digitar:

    $ go run main.go

para executar o programa no 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()
}

Configurar o comportamento do Scanner em Go

O tipo Scanner tem uma função Split que aceita uma função SplitFunc para determinar como o scanner vai dividir a fatia de byte dada. O padrão SplitFunc é o ScanLines que retorna cada linha do texto, desnuda do marcador de fim de linha.

Por exemplo, poderíamos dividir utilizando palavras, como mostrado no trecho de código abaixo,


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