Три способа чтения файлов построчно в Golang
Три способа чтения файлов построчно в Golang

Golang — это современный язык программирования, который эффективен, лаконичен и масштабируем, поэтому широко используется в различных областях. В Golang чтение файлов — обычная операция. В этом техническом блоге я расскажу, как читать файлы построчно в Golang.

1. Используйте bufio.Scanner для чтения файлов.

Golang один из них bufio пакет, который обеспечивает Scanner введите для удобного чтения файлов построчно. мы можем использовать Scanner из Scan() метод чтения каждой строки.

bufio.Scanner — это сканер на основе буфера, который обеспечивает удобные операции построчного/пословного чтения. Сканировать Метод bufio.Scanner. Основной метод, используемый для сканирования буфера и возврата к следующему сканированию. Token。

Метод Scan имеет следующую сигнатуру:

Язык кода:javascript
копировать
func (s *Scanner) Scan() bool

Этот метод возвращает bool введите значение,Указывает, прошло ли сканирование успешно. Если сканирование прошло успешно,Этот метод прочитает следующий токен и сохранит его в поле ScannerizText. Если сканирование не удалось,Возвращает ложь.

Прежде чем читать токен,Сканер будет читать изданные в буфере в базовый изReader.,И получить новые изданные из базового изReader и заполнить их в буфер. поэтому,Перед вызовом метода Scan,Scannerizbuffer может уже содержать часть данных,Также может быть пустым.

Во время сканирования,Сканер разделит изданные в буфере данные по разделителю.,И возвращаем разделенный изToken. По умолчанию,Scanner использует новую строку в качестве разделителя,То есть сканируйте одну строку данных за раз. Если вам нужно использовать другие разделители,Его можно задать методом Scanner и Split.

Язык кода:javascript
копировать
// ReadLines reads all lines of the file.
func ReadLines(path string) ([]string, error) {
	file, err := os.Open(path)
	if err != nil {
		return nil, err
	}
	defer file.Close()

	var lines []string
	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		lines = append(lines, scanner.Text())
	}
	return lines, scanner.Err()
}

В приведенном выше коде мы сначала используем NewScanner() функция создает Scanner объект. затем в for В цикле мы используем Scanner из Scan() методпрочитать архивировать каждую строку, затем использовать Text() Метод для получения содержимого каждой строки. Наконец, мы добавляем выбранные строки к фрагменту строки.

2. Используйте bufio.Reader для чтения файла.

Помимо использования Scanner Помимо типов, мы также можем использовать bufio Баочжун из Reader Type читает файл построчно. в использовании bufio.Reader когда нам нужно использовать ReadBytes() или ReadString() Метод чтения каждой строки, пример кода выглядит следующим образом:

Язык кода:javascript
копировать
// ReadLinesV2 reads all lines of the file.
func ReadLinesV2(path string) ([]string, error) {
	file, err := os.Open(path)
	if err != nil {
		return nil, err
	}
	defer file.Close()

	var lines []string
	reader := bufio.NewReader(file)
	for {
		// ReadString reads until the first occurrence of delim in the input,
		// returning a string containing the data up to and including the delimiter.
		line, err := reader.ReadString('\n')
		if err == io.EOF {
			lines = append(lines, line)
			break
		}
		if err != nil {
			return lines, err
		}
		lines = append(lines, line[:len(line)-1])
	}
	return lines, nil
}

В приведенном выше коде,насиспользовать NewReader() функция создает Reader объект. существовать for В цикле мы используем ReadString() Функция считывает каждую строку содержимого и добавляет ее к фрагменту строки.

Следует отметить, что из есть, inuse ReadString() функции, нам нужно указать разделитель, например ‘\n’ Указывает на использование символа новой строки в качестве разделителя. Если разделитель из не указан в читаемом файле, ReadString() Функция вернет ошибку, поэтому нам нужно for Проверьте, не произошла ли ошибка в цикле.

3. Используйте ReadLine bufio.Reader для чтения файла.

использовать bufio.Reader построчнопрочитать файлчас,Помимо использования ReadBytes() или ReadString() Метод, вы также можете использовать ReadLine() функция.

Язык кода:javascript
копировать
// ReadLinesV3 reads all lines of the file.
func ReadLinesV3(path string) ([]string, error) {
	f, err := os.Open(path)
	if err != nil {
		return nil, err
	}
	defer f.Close()

	var lines []string
	r := bufio.NewReader(f)
	for {
		// ReadLine is a low-level line-reading primitive.
		// Most callers should use ReadBytes('\n') or ReadString('\n') instead or use a Scanner.
		bytes, _, err := r.ReadLine()
		if err == io.EOF {
			break
		}
		if err != nil {
			return lines, err
		}
		lines = append(lines, string(bytes))
	}
	return lines, nil
}

использовать bufio.Reader из ReadLine() Метод может прочитать строку текста, но следует отметить, что он возвращает значение. Читать Линию() функцияиз Возвращаемое значение состоит из трех частей:читатьизданные、Читать ли полную строку и сообщение об ошибке。есличитатьизданныевнекэшокругизразмер,он вернет сообщение об ошибке,Вместо полного из строк данных.

поэтому,Если длина читаемой строки превышает размер области,Функция ReadLine() не сможет прочитать данные строки полностью. Чтобы не допустить возникновения такой ситуации,Мы можем решить эту проблему, задав размер кэш-области.

ReadLine Это низкоуровневый примитив чтения строк. Большинству вызывающих абонентов следует использовать ReadBytes(‘\n’) или ReadString(‘\n’),или ВОЗиспользовать Scanner。

4.go-huge-util

Реализация данной статьи размещена на складе с открытым исходным кодом. dablelv/go-huge-util,Приветствую всех.

Язык кода:javascript
копировать
package main

import (
	"github.com/dablelv/go-huge-util/file"
)

func main() {
	path := "your/file/path"
	lines, err := file.ReadLines(path)
	lines, err = file.ReadLinesV2(path)
	lines, err = file.ReadLinesV3(path)
}

рекомендоватьиспользовать file.ReadLines。

go-huge-util Помимо преобразования типов, имеется множество других практических функций, таких как шифрование, дешифрование, архивирование. Декомпрессия и т.д., приветствую всех, пользуйтесь, Star, Issue и Pull Request。

boy illustration
【Java】Решено: org.springframework.http.converter.HttpMessageNotWritableException.
boy illustration
Изучите Kimi Smart Assistant: как использовать сверхдлинный текст, чтобы открыть новую сферу эффективной обработки информации
boy illustration
Начало работы с Docker: использование томов данных и монтирования файлов для хранения и совместного использования данных
boy illustration
Использование Python для реализации автоматической публикации статей в публичном аккаунте WeChat
boy illustration
Разберитесь в механизме и принципах взаимодействия потребителя и брокера Kafka в одной статье.
boy illustration
Spring Boot — использование Resilience4j-Circuitbreaker для реализации режима автоматического выключателя_предотвращения каскадных сбоев
boy illustration
13. Springboot интегрирует Protobuf
boy illustration
Примечание. Инструмент управления батареями Dell Dell Power Manager
boy illustration
Общая интерпретация класса LocalDate [java]
boy illustration
[Базовые знания ASP.NET Core] -- Веб-API -- Создание и настройка веб-API (1)
boy illustration
Настоящий бой! Подключите Passkey к своему веб-сайту для безопасного входа в систему без пароля.
boy illustration
Руководство по настройке Nginx: как найти, интерпретировать и оптимизировать настройки Nginx в Linux
boy illustration
Typecho отображает использование памяти сервера
boy illustration
Как вставить элемент перед указанным ключом в ассоциативный массив в PHP
boy illustration
swagger2 экспортирует API как текстовый документ (реализация Java) [легко понять]
boy illustration
Выбор фреймворка nodejs Express koa egg MidwayJS сравнение NestJS
boy illustration
Руководство по загрузке, установке и использованию SVN «Рекомендуемая коллекция»
boy illustration
Интерфейс PHPforwarding_php отправляет запрос на получение
boy illustration
Создавайте и защищайте связь в реальном времени с помощью SignalR и Azure Active Directory.
boy illustration
ВичатПубличная платформаразвивать(три)——ВичатQR-кодгенерировать&Сканировать кодсосредоточиться на
boy illustration
[Углубленное понимание Java IO] Используйте InputStreamReader для чтения содержимого файла и легкого выполнения задач преобразования текста.
boy illustration
сравнение строк PHP
boy illustration
9 сценариев асинхронного сбоя @Async
boy illustration
Эффективная обработка запланированных задач: углубленное изучение секретов библиотеки APScheduler на Python
boy illustration
Рекомендации по облегченному артефакту развязки внутренних компонентов Spring Event (событие Spring)
boy illustration
Go: Лесоруб-лесоруб на колесах Введение
boy illustration
Основы серверной разработки: технология кэширования, которую должен освоить каждый программист
boy illustration
Java Advanced Collections TreeSet: что это такое и зачем его использовать?
boy illustration
Оказывается, у команды go build столько знаний
boy illustration
Node.js