ホームページ > バックエンド開発 > Golang > スキャナーを使用して Go で特定の行番号から始まるファイルを読み取る方法は?

スキャナーを使用して Go で特定の行番号から始まるファイルを読み取る方法は?

Barbara Streisand
リリース: 2024-11-08 10:01:02
オリジナル
503 人が閲覧しました

How to Read a File Starting from a Specific Line Number in Go using a Scanner?

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

最初は、ファイルを 1 行ずつ読み取り、進行状況を保存する際に問題が発生する可能性があります。行く。 bufio パッケージのスキャナーは行番号のメソッドを提供しません。ただし、考えられる解決策は次のとおりです。

1.分割機能によるスキャナの拡張

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()
}
ログイン後にコピー

2 を使用して位置 (pos) を維持します。 bufio.Reader

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート