Como ler eficientemente um arquivo linha por linha em GO
- Pacote e Importações Necessárias
- Ler linha por linha em Go
- Código completo para ler um arquivo linha a linha em Go
-
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 operacionalfmt
- implementando a funcionalidade de E/S formatadalog
- pacote padrão de extraçãobufio
- 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