Cómo leer eficientemente un archivo línea por línea en GO
- Paquete e Importaciones Necesarias
- Lectura línea por línea en Go
- Código completo para leer un archivo línea por línea en Go
-
Configurar el comportamiento del
Scanner
en Go
El archivo I/O
, específicamente la lectura y escritura de archivos es una funcionalidad bastante común de los lenguajes de programación. A menudo, necesitas leer un archivo línea por línea. GO provee el paquete bufio
que básicamente implementa el buffer I/O
. bufio
proporciona tipos y funciones útiles, particularmente para leer y escribir en archivos de texto.
Paquete e Importaciones Necesarias
package main
import(
"fmt"
"bufio"
"log"
"os"
)
Necesitaremos varias importaciones de la GO biblioteca estándar:-
os
- para la interfaz independiente de la plataforma para la funcionalidad del sistema operativofmt
- implementando la funcionalidad de E/S formateadalog
- paquete de registro estándarbufio
- soporta E/S con buffer.
Lectura línea por línea en Go
Antes de leer el archivo, primero hay que abrirlo con la función os.Open()
que devuelve un tipo de puntero al archivo. El archivo test.txt
que se muestra en el fragmento de código necesita existir previamente (ponga la ruta donde está su archivo).
La función bufio.NewScanner(file)
devuelve un tipo de escáner que tiene funciones que soportan la lectura a través del archivo.
Para leer línea por línea en el fichero, necesitamos usar dos métodos en el nuevo Scanner
- Scan
, que avanza el escáner al nuevo token (en este caso la nueva línea) y Text
(o Byte
) que lee el token más reciente que se generó cuando se llamó a Scan
.
Si se encontró algún error al leer el archivo, puede ser manejado por una llamada al método Err()
en el nuevo Scanner
, que devolverá el primer error de no finalización del archivo encontrado por el 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 leer un archivo línea por línea en Go
El código completo en main.go
para leer un archivo línea por línea se proporciona a continuación.
Necesitas escribir:
$ go run main.go
para ejecutar el programa en la 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 el comportamiento del Scanner
en Go
El tipo Scanner
tiene una función Split
que acepta una función SplitFunc
para determinar cómo el escáner va a dividir el trozo de byte dado. La función por defecto SplitFunc
es la de ScanLines
que devuelve cada línea de texto, sin el marcador de final de línea.
Por ejemplo, podríamos dividir usando palabras como se muestra en el fragmento de código de abajo,
scanner.Split(bufio.ScanWords) //configure how the scanner behaves