首頁 >後端開發 >Golang >如何使用 Go 中的掃描器從特定行繼續讀取檔案?

如何使用 Go 中的掃描器從特定行繼續讀取檔案?

Barbara Streisand
Barbara Streisand原創
2024-11-06 04:15:02386瀏覽

How to Resume Reading a File from a Specific Line Using the Scanner in Go?

使用掃描器從特定行號讀取檔案

處理檔案時,通常需要從特定行號繼續讀取檔案。 bufio套件中的Scanner類型可以擴充支援該功能。

自訂分割功能

使用Scanner的問題在於缺乏線路定位功能。但是,我們可以建立一個自訂的 SplitFunc,它根據換行符拆分輸入,並傳回讀取的字元數以維持檔案位置。

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

此 SplitFunc 將位置變數遞增為數字讀取的字元數。

修改掃描器

接下來,我們需要修改掃描器以使用我們自訂的 SplitFunc。

func withScannerAtPosition(input io.ReadSeeker, start int64) error {
    fmt.Println("--SCANNER, start:", start)
    if _, err := input.Seek(start, 0); err != nil {
        return err
    }
    scanner := bufio.NewScanner(input)
    scanner.Split(scanLinesWithPosition)

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

範例用法

中在此範例中,我們讀取範例檔案並使用行號列印其內容:

func main() {
    input := strings.NewReader("first\r\nsecond\nthird\nfourth")
    if err := withScannerAtPosition(input, 0); err != nil {
        fmt.Println("Scanner error:", err)
    }
}

輸出:

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

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

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