Cómo leer eficientemente un archivo línea por línea en GO

  1. Paquete e Importaciones Necesarias
  2. Lectura línea por línea en Go
  3. Código completo para leer un archivo línea por línea en Go
  4. 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 operativo
  • fmt - implementando la funcionalidad de E/S formateada
  • log - paquete de registro estándar
  • bufio - 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 (https://golang.org/pkg/bufio/#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

comments powered by Disqus