In Go, the bufio.Scanner package provides a convenient way to read files line by line. However, by default, Scanner does not offer a method to skip or read from a specific line number. To achieve this, we need to modify the default behavior of Scanner.
We can extend the Scanner by creating a custom split function that determines the line boundaries and maintains the file position. Let's define a split function that returns the advance in bytes to the next line break and the line as a token:
func scanLinesWithPosition(data []byte, atEOF bool) (advance int, token []byte, err error) { advance, token, err = bufio.ScanLines(data, atEOF) return // Advance and Token are calculated }
Next, we can use the Scanner.Split method to set our custom splitter function:
scanner := bufio.NewScanner(inputFile) scanner.Split(scanLinesWithPosition)
With the custom split function in place, we can read lines while also maintaining the file position. Here's a modified version of your existing code:
// ... (Code from your post) func main() { // ... (Code from your post) scanner := bufio.NewScanner(inputFile) scanner.Split(scanLinesWithPosition) var currentLine int for scanner.Scan() { currentLine++ if currentLine > progress { fmt.Println(scanner.Text()) } } // ... (Code from your post) }
Now, the code reads lines, skips lines already processed (based on the progress variable), and maintains the current line number. By adjusting the progress value, you can control the starting line number.
The above is the detailed content of How to Read a File from a Specific Line Number Using Scanner in Go?. For more information, please follow other related articles on the PHP Chinese website!