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
Scannerem 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