最初,您可能會在逐行讀取檔案並將進度保存在去。 bufio 套件中的掃描器不提供行號方法。但是,以下是潛在的解決方案:
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() }
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中文網其他相關文章!