Как я могу сделать функцию чтения файлов более эффективной? - PullRequest
2 голосов
/ 21 февраля 2020

Я пытаюсь этот код:

// GetFooter returns a string which is the Footer of an edi file
func GetFooter(file *os.File) (out string, err error) {
    // TODO can scanner read files backwards?  Seek can get us to the end of file 
    var lines []string
    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        lines = append(lines, scanner.Text())
    }
    line1 := lines[len(lines)-2]
    line2 := lines[len(lines)-1]

    return line1 + "\n" + line2, scanner.Err()  
}

Мне интересно, есть ли более дешевый способ получить последние две строки файла?

Ответы [ 2 ]

3 голосов
/ 21 февраля 2020

При сканировании буфера в памяти можно сохранить только две последние строки.

Попробуйте на Go детской площадке.

package main

import (
    "fmt"
    "bufio"
    "bytes"
    "strconv"
)

func main() {
    var buffer bytes.Buffer
    for i := 0; i < 1000; i++ {
        s := strconv.Itoa(i)
        buffer.WriteString(s + "\n")
    }   
    fmt.Println(GetFooter(&buffer))
}

func GetFooter(file *bytes.Buffer) (out string, err error) {
    var line1, line2 string
    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        line1, line2 = line2, scanner.Text()
    }
    return line1 + "\n" + line2, scanner.Err()  
}
1 голос
/ 21 февраля 2020

Если вы приблизительно знаете размер последних двух строк, вы можете установить SOME_NUMBER в качестве этого размера плюс несколько дополнительных байтов, чтобы убедиться, что вы всегда захватываете последние две строки, а затем сделать что-то вроде

file, err := os.Open(fileName)
if err != nil {
    panic(err)
}
defer file.Close()

buf := make([]byte, SOME_NUMBER)
stat, err := os.Stat(fileName)
start := stat.Size() - SOME_NUMBER
_, err = file.ReadAt(buf, start)
if err != nil {
    panic(err)
}
lines := strings.Split(string(start), "\n", -1)
lines = lines[len(lines)-2:]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...