ファイルを操作する場合、多くの場合、特定の行番号からファイルの読み取りを再開する必要があります。 bufio パッケージのスキャナー タイプは、この機能をサポートするように拡張できます。
スキャナーを使用する場合の問題は、行の位置決め機能が欠如していることです。ただし、改行文字に基づいて入力を分割し、ファイルの位置を維持するために読み取られた文字数を返すカスタム 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 中国語 Web サイトの他の関連記事を参照してください。