Как эффективно читать файл строка за строкой в GO

Wechuli Paul 30 Январь 2023 18 Апрель 2020
  1. Упаковка и необходимые импортные товары
  2. Чтение строк за строкой вперёд
  3. Полный код для чтения файла строка за строкой вперёд
  4. Настройка поведения сканера в Go
Как эффективно читать файл строка за строкой в GO

Файловый ввод/вывод, а именно чтение и запись в файлы, является довольно распространенной функциональностью языков программирования. Часто необходимо читать файл построчно. GO предоставляет пакет bufio, который в основном реализует буферизованный ввод/вывод. bufio предоставляет полезные типы и функции, особенно для чтения и записи в текстовые файлы.

Упаковка и необходимые импортные товары

package main

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

Нам понадобится несколько импортов из GO стандартная библиотека:-.

  • os - для платформонезависимого интерфейса к функциональности ОС.
  • fmt - реализация функциональности форматированных входов/выходов.
  • log - стандартный пакет протоколирования
  • буфио - поддерживает буферизацию входов/выходов.

Чтение строк за строкой вперёд

Перед чтением файла его нужно сначала открыть функцией os.Open(), которая возвращает в файл тип указателя. Файл test.txt, показанный в фрагменте кода, должен существовать заранее (указать путь к файлу).

Функция bufio.NewScanner(file) возвращает тип сканера, который имеет функции, поддерживающие чтение через файл.

Чтобы прочитать файл построчно, мы должны использовать два метода на новом Scanner - Scan, который переводит сканер на новый маркер (в данном случае на новую строку) и Text(или Byte), который считывает самую последнюю маркерную запись, которая была сгенерирована при вызове Scan.

Если при чтении файла были обнаружены какие-либо ошибки, они могут быть обработаны вызовом метода Err() на новом Scanner, который будет возвращать первую ошибку, с которой столкнулся 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()
}

Полный код для чтения файла строка за строкой вперёд

Полный код в main.go для чтения файла строка за строкой приведен ниже.

Вам необходимо набрать:

    $ go run main.go

чтобы запустить программу в терминале.


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()
}

Настройка поведения сканера в Go

Тип Scanner имеет функцию SplitFunc, которая принимает функцию SplitFunc для определения того, как сканер собирается разделить заданный срез байта. По умолчанию SplitFunc имеет функцию ScanLines, которая возвращает каждую строку текста, лишённую маркера конца строки.

Например, мы могли бы разделиться, используя слова, как показано в фрагменте кода ниже:-


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