最初は、ファイルを 1 行ずつ読み取り、進行状況を保存する際に問題が発生する可能性があります。行く。 bufio パッケージのスキャナーは行番号のメソッドを提供しません。ただし、考えられる解決策は次のとおりです。
bufio.Scanner は、位置を維持するために拡張できます。入力をトークン (行) に分割し、読み取りバイトを追跡する分割関数を実装します。以下の例では、組み込みの bufio.ScanLines() をベースとして使用し、事前戻り値
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 を使用すると、区切り文字として「n」を使用して ReadBytes() で行を読み取ることができます。以下の例では、複数の行終端シーケンス (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」を使用できます。クリーンスタート (スタート = 0) と再開位置 (スタート = 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 中国語 Web サイトの他の関連記事を参照してください。