首頁  >  文章  >  後端開發  >  如何使用掃描器讀取 Go 中從特定行號開始的檔案?

如何使用掃描器讀取 Go 中從特定行號開始的檔案?

Barbara Streisand
Barbara Streisand原創
2024-11-08 10:01:02364瀏覽

How to Read a File Starting from a Specific Line Number in Go using a Scanner?

如何使用掃描器從特定行號開始讀取檔案?

最初,您可能會在逐行讀取檔案並將進度保存在去。 bufio 套件中的掃描器不提供行號方法。但是,以下是潛在的解決方案:

1。使用分割功能擴充掃描器

bufio.Scanner 可以擴充以保持位置。實作一個分割函數,將輸入分割成標記(行)並追蹤讀取的位元組。下面的範例使用內建 bufio.ScanLines() 作為基礎,並使用提前返回值維護位置 (pos):

func withScanner(input io.ReadSeeker, start int64) error {
    if _, err := input.Seek(start, 0); err != nil {
        return err
    }
    scanner := bufio.NewScanner(input)

    pos := start
    scanLines := func(data []byte, atEOF bool) (advance int, token []byte, err error) {
        advance, token, err = bufio.ScanLines(data, atEOF)
        pos += int64(advance)
        return
    }
    scanner.Split(scanLines)

    for scanner.Scan() {
        fmt.Printf("Pos: %d, Scanned: %s\n", pos, scanner.Text())
    }
    return scanner.Err()
}

2。使用 bufio.Reader

bufio.Reader 允許您使用 ReadBytes() 使用 'n' 作為分隔符號來讀取一行。下面的範例處理多個行終止符序列(rn) 並將它們從讀取行中剝離:

func withReader(input io.ReadSeeker, start int64) error {
    if _, err := input.Seek(start, 0); err != nil {
        return err
    }

    r := bufio.NewReader(input)
    pos := start
    for {
        data, err := r.ReadBytes('\n')
        pos += int64(len(data))
        if err == nil || err == io.EOF {
            if len(data) > 0 && data[len(data)-1] == '\n' {
                data = data[:len(data)-1]
            }
            if len(data) > 0 && data[len(data)-1] == '\r' {
                data = data[:len(data)-1]
            }
            fmt.Printf("Pos: %d, Read: %s\n", pos, data)
        }
        if err != nil {
            if err != io.EOF {
                return err
            }
            break
        }
    }
    return nil
}

測試解決方案

要測試解決方案,您可以使用內容「firstrnsecondnthirdnfourth」作為具有乾淨啟動(start = 0)和恢復位置(start = 14)的輸入。輸出將顯示位置並讀取行:

--SCANNER, start: 0
Pos: 7, Scanned: first
Pos: 14, Scanned: second
Pos: 20, Scanned: third
Pos: 26, Scanned: fourth
--READER, start: 0
Pos: 7, Read: first
Pos: 14, Read: second
Pos: 20, Read: third
Pos: 26, Read: fourth
--SCANNER, start: 14
Pos: 20, Scanned: third
Pos: 26, Scanned: fourth
--READER, start: 14
Pos: 20, Read: third
Pos: 26, Read: fourth

以上是如何使用掃描器讀取 Go 中從特定行號開始的檔案?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn