Go のスキャナーを使用して特定の行からファイルの読み取りを再開するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-11-06 04:15:02
オリジナル
316 人が閲覧しました

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

スキャナを使用して特定の行番号からファイルを読み取る

ファイルを操作する場合、多くの場合、特定の行番号からファイルの読み取りを再開する必要があります。 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!