使用Golang读取文本文件并输出结果

使用Golang读取文本文件并输出结果 你好,

我有三个不同的包,其中包含结构体。我正在尝试创建一个程序,该程序读取文件,并在行以特定数字开头时调用特定的函数。例如,当行以“1”开头时,程序应调用函数A,然后转到下一行,如果行以“2”开头,则调用函数B。有人能帮我编写这类代码吗?

4 回复

到目前为止你尝试了什么?你应该能够通过 os.Open 打开文件,并使用 bufio.Scanner 逐行扫描文件。这里有一些使用 Scanner 的示例。

func main() {
    fmt.Println("hello world")
}

更多关于使用Golang读取文本文件并输出结果的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


感谢您的详细说明。那么您当前的问题是希望它读取整个文件,而不仅仅是第一行?如果是这样,您可以使用一个 for 循环。简单示例如下(您可能还需要检查诸如空行之类的情况):

for scanner.Scan() {
    line := scanner.Text()
    switch line[0] {
    case '1':
        // 调用函数 A
    case '2':
        // 调用函数 B
    default:
        // 默认情况
    }
}

这是我目前所完成的部分,在这个程序中,我正在读取第一行以检查它是否以“1”开头,如果是,则调用另一个函数。

package main

import (
	"bufio"
	//“fmt”
	pack "package"
	"log"
	"os"
)

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

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

	scanner := bufio.NewScanner(file)
	fileLineNumber := 0

	scanner.Scan()
	line := scanner.Text()
	linenumber++
	var val pack1 = func1
	if line[0] == '1' {
		val, err = pack.func2(line)
		log.Fatal("The first line of the file is", val)
	} else {
		log.Fatal("Invalid file - " + line + "\n")
	}
}

以下是一个使用Go读取文本文件并根据行首数字调用不同函数的示例:

package main

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

// 示例结构体
type PackageA struct {
	Data string
}

type PackageB struct {
	Data string
}

type PackageC struct {
	Data string
}

// 对应不同数字的处理函数
func handleTypeA(line string) {
	// 移除行首数字和空格
	content := strings.TrimSpace(line[1:])
	pkg := PackageA{Data: content}
	fmt.Printf("调用函数A处理: %+v\n", pkg)
}

func handleTypeB(line string) {
	content := strings.TrimSpace(line[1:])
	pkg := PackageB{Data: content}
	fmt.Printf("调用函数B处理: %+v\n", pkg)
}

func handleTypeC(line string) {
	content := strings.TrimSpace(line[1:])
	pkg := PackageC{Data: content}
	fmt.Printf("调用函数C处理: %+v\n", pkg)
}

func main() {
	// 打开文件
	file, err := os.Open("data.txt")
	if err != nil {
		fmt.Printf("打开文件失败: %v\n", err)
		return
	}
	defer file.Close()

	scanner := bufio.NewScanner(file)
	lineNumber := 0

	// 逐行读取文件
	for scanner.Scan() {
		lineNumber++
		line := scanner.Text()
		
		// 跳过空行
		if len(line) == 0 {
			continue
		}

		// 根据行首数字调用不同函数
		switch line[0] {
		case '1':
			handleTypeA(line)
		case '2':
			handleTypeB(line)
		case '3':
			handleTypeC(line)
		default:
			fmt.Printf("第%d行: 未知的行首数字 '%c'\n", lineNumber, line[0])
		}
	}

	if err := scanner.Err(); err != nil {
		fmt.Printf("读取文件失败: %v\n", err)
	}
}

如果需要更灵活的处理方式,可以使用函数映射:

package main

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

// 定义处理函数类型
type HandlerFunc func(string)

// 处理函数映射
var handlers = map[byte]HandlerFunc{
	'1': func(line string) {
		content := strings.TrimSpace(line[1:])
		fmt.Printf("处理类型1: %s\n", content)
	},
	'2': func(line string) {
		content := strings.TrimSpace(line[1:])
		fmt.Printf("处理类型2: %s\n", content)
	},
	'3': func(line string) {
		content := strings.TrimSpace(line[1:])
		fmt.Printf("处理类型3: %s\n", content)
	},
}

func main() {
	file, err := os.Open("data.txt")
	if err != nil {
		fmt.Printf("打开文件失败: %v\n", err)
		return
	}
	defer file.Close()

	scanner := bufio.NewScanner(file)

	for scanner.Scan() {
		line := scanner.Text()
		if len(line) == 0 {
			continue
		}

		firstChar := line[0]
		if handler, exists := handlers[firstChar]; exists {
			handler(line)
		} else {
			fmt.Printf("未找到处理函数: %c\n", firstChar)
		}
	}

	if err := scanner.Err(); err != nil {
		fmt.Printf("读取文件失败: %v\n", err)
	}
}

示例文件 data.txt 内容:

1 这是类型A的数据
2 这是类型B的数据
3 这是类型C的数据
1 另一条类型A的数据

运行第一个示例代码的输出:

调用函数A处理: {Data:这是类型A的数据}
调用函数B处理: {Data:这是类型B的数据}
调用函数C处理: {Data:这是类型C的数据}
调用函数A处理: {Data:另一条类型A的数据}
回到顶部