처음에는 파일을 한 줄씩 읽고 진행 상황을 저장하는 데 어려움을 겪을 수 있습니다. 가다. 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를 사용하면 '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 중국어 웹사이트의 기타 관련 기사를 참조하세요!