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
这是输入吗?给定这个输入,期望的输出是什么?你尝试过什么可以展示给我们看的吗?
更多关于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

