Golang实现按每3行读取并打印文件内容

Golang实现按每3行读取并打印文件内容 大家好,

我对Go语言编程非常陌生,我想读取一个文件并每三行打印一次, 我已经搜索了一周,但找不到具体的方法。

vm: 2020
        group vmMemcache
        state started

vm: 2021
        group vmMemcache
        state started

vm: 2022
        group haMemcache
        state started

vm: 2023
        group vmMemcache
        state started

更多关于Golang实现按每3行读取并打印文件内容的实战教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

这是输入吗?给定这个输入,期望的输出是什么?你尝试过什么可以展示给我们看的吗?

更多关于Golang实现按每3行读取并打印文件内容的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


gzek:

打印出文件中的那3行

哪几行?你希望结果看起来是什么样?

非常感谢!我现在有这样的打印输出。

❯ go run exer1.go
Got three lines:
Line 0 is vm: 8001
Line 1 is         group haMemcache
Line 2 is         state started

我不得不在你的代码末尾加上 break… 来选择前三个行 0, 1, 2。 我现在正在琢磨如何操作它,比如如何打印出我需要的、每三个一组中的每一行…

感谢您的回复。

package main

import (
    "bufio"
    "fmt"
    "log"
    "os"
)

func main() {

    f, err := os.Open("sample.txt")

    if err != nil {
        log.Fatal(err)
    }

    defer f.Close()

    scanner := bufio.NewScanner(f)

    for scanner.Scan() {

        fmt.Println(scanner.Text())
    }

    if err := scanner.Err(); err != nil {
        log.Fatal(err)
    }
}

…并且想使用这个程序打印出文件中的那3行;我在网上某个地方找到了这个格式,但我搞砸了…

package main

import (
      "bufio"
      "fmt"
      "log"
      "os"
)

func main() {
file, err := os.Open("resources.cfg")

if err != nil {
        log.Fatalf("failed opening file: %s", err)
}

        scanner := bufio.NewScanner(file)

        scanner.Scan()
        line := scanner.Text()

        for scanner.Scan(){
                if line[4] == '4' {
                        fmt.Println(scanner.Text())
                        break
        }
        }

}

我搜索了一周,也没找到具体该怎么做。

通过搜索来寻找算法并不总是有帮助。试着思考一下,如果你是计算机,你会怎么做,然后尝试将其转化为代码。

你已经有了逐行读取文件的代码:scanner.Text() 就是最后读取的一行文本。你需要存储这些行,直到收集到三行为止,然后对这“三行”进行“某些操作”。接着,忽略空行,开始寻找下一个三行。

一种实现方法是,将行收集到一个切片中,当切片长度为三时执行某些操作。

  scanner := bufio.NewScanner(f)

  lines := []string{}  // 用于存储读取的行

  for scanner.Scan() {
    lines = append(lines, scanner.Text()) // 将新行添加到存储的行中

    if len(lines) == 3 { // 这就是我们想要的,读取了三行
      // 对这三行进行某些操作
      fmt.Println("Got three lines:") 
      for i, line := range lines {
        fmt.Printf("Line %d is %s\n", i, line)
      }
      // -- 操作结束
      lines = []string{} // 重置存储的行,为下一个三行块做准备
      scanner.Scan() // 跳过空行
    }
  }

在你的文件上运行此代码的输出是:

Got three lines:
Line 0 is vm: 2020
Line 1 is         group vmMemcache
Line 2 is         state started
Got three lines:
Line 0 is vm: 2021
Line 1 is         group vmMemcache
Line 2 is         state started
Got three lines:
Line 0 is vm: 2022
Line 1 is         group haMemcache
Line 2 is         state started
Got three lines:
Line 0 is vm: 2023
Line 1 is         group vmMemcache
Line 2 is         state started

可以使用 bufio.Scanner 配合计数器实现每3行读取并打印:

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	file, err := os.Open("yourfile.txt")
	if err != nil {
		panic(err)
	}
	defer file.Close()

	scanner := bufio.NewScanner(file)
	lineCount := 0
	var buffer []string

	for scanner.Scan() {
		line := scanner.Text()
		buffer = append(buffer, line)
		lineCount++

		if lineCount%3 == 0 {
			// 打印当前三行内容
			for _, l := range buffer {
				fmt.Println(l)
			}
			fmt.Println() // 添加空行分隔每组
			buffer = buffer[:0] // 清空缓冲区
		}
	}

	// 处理剩余不足三行的内容
	if len(buffer) > 0 {
		for _, l := range buffer {
			fmt.Println(l)
		}
	}

	if err := scanner.Err(); err != nil {
		panic(err)
	}
}

如果文件内容格式固定,可以更精确地按逻辑分组读取:

package main

import (
	"bufio"
	"fmt"
	"os"
)

func main() {
	file, err := os.Open("yourfile.txt")
	if err != nil {
		panic(err)
	}
	defer file.Close()

	scanner := bufio.NewScanner(file)
	group := make([]string, 0, 3)

	for scanner.Scan() {
		line := scanner.Text()
		if line == "" {
			continue // 跳过空行
		}
		
		group = append(group, line)
		
		if len(group) == 3 {
			// 打印完整的三行组
			for _, g := range group {
				fmt.Println(g)
			}
			fmt.Println() // 组间空行
			group = group[:0] // 重置组
		}
	}

	// 打印最后一组(如果存在)
	if len(group) > 0 {
		for _, g := range group {
			fmt.Println(g)
		}
	}
}

对于示例中的文件格式,输出结果将是:

vm: 2020
        group vmMemcache
        state started

vm: 2021
        group vmMemcache
        state started

vm: 2022
        group haMemcache
        state started

vm: 2023
        group vmMemcache
        state started
回到顶部