Golang один из них bufio пакет, который обеспечивает Scanner введите для удобного чтения файлов построчно. мы можем использовать Scanner из Scan() метод чтения каждой строки.
bufio.Scanner — это сканер на основе буфера, который обеспечивает удобные операции построчного/пословного чтения. Сканировать Метод bufio.Scanner. Основной метод, используемый для сканирования буфера и возврата к следующему сканированию. Token。
Метод Scan имеет следующую сигнатуру:
func (s *Scanner) Scan() bool
Этот метод возвращает bool введите значение,Указывает, прошло ли сканирование успешно. Если сканирование прошло успешно,Этот метод прочитает следующий токен и сохранит его в поле ScannerizText. Если сканирование не удалось,Возвращает ложь.
Прежде чем читать токен,Сканер будет читать изданные в буфере в базовый изReader.,И получить новые изданные из базового изReader и заполнить их в буфер. поэтому,Перед вызовом метода Scan,Scannerizbuffer может уже содержать часть данных,Также может быть пустым.
Во время сканирования,Сканер разделит изданные в буфере данные по разделителю.,И возвращаем разделенный изToken. По умолчанию,Scanner использует новую строку в качестве разделителя,То есть сканируйте одну строку данных за раз. Если вам нужно использовать другие разделители,Его можно задать методом Scanner и Split.
// 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() Метод для получения содержимого каждой строки. Наконец, мы добавляем выбранные строки к фрагменту строки.
Помимо использования Scanner Помимо типов, мы также можем использовать bufio Баочжун из Reader Type читает файл построчно. в использовании bufio.Reader когда нам нужно использовать ReadBytes() или ReadString() Метод чтения каждой строки, пример кода выглядит следующим образом:
// 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 Проверьте, не произошла ли ошибка в цикле.
использовать bufio.Reader построчнопрочитать файлчас,Помимо использования ReadBytes() или ReadString() Метод, вы также можете использовать ReadLine() функция.
// 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。
Реализация данной статьи размещена на складе с открытым исходным кодом. dablelv/go-huge-util,Приветствую всех.
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。