Golang读取和替换文本文件中的值

Golang读取和替换文本文件中的值 我有一个文本文件,文件中有一些包含值的文本。例如: name=legend serverip=x.x.x.x owner=self

我想将值读取到变量中,例如,我想将 owner 读取到变量 owneroftxt 中,这样当我执行 fmt.Println(owneroftxt) 时,它会打印 self。 类似地,我想将某个数据的值读取到一个变量中。然后我想用我自己的值替换这些值,例如我想设置 owner=me,然后如果我打印 owner,它将打印 me

有什么想法吗?我想了很多,但没找到任何思路。

3 回复

你已经问过这个问题了:

如何从文件中读取一行并替换它?

更多关于Golang读取和替换文本文件中的值的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


引用自 如何从文件中读取一行并替换它? 分类:Getting Help

我想替换这些字符串, 我尝试过读取行并将它们的文本存储在变量中。 像这样:

fileIO, err := os.OpenFile("my.txt", os.O_RDWR, 0600)
            if err != nil {
            fmt.Println("Error ELOP0 ! Contact Support")

        }

        defer fileIO.Close()

        rawBytes, err := ioutil.ReadAll(fileIO)

        if err != nil {

            fmt.Println("Error EROP99X! Contact Support")

        }

        lines := strings.Split(string(rawBytes), "\n")

       …

请检查一下。

在Go中处理这种键值对格式的文本文件,可以使用strings包进行分割解析。以下是完整的解决方案:

package main

import (
	"fmt"
	"io/ioutil"
	"strings"
)

// 读取配置文件到map
func readConfig(filename string) (map[string]string, error) {
	config := make(map[string]string)
	
	data, err := ioutil.ReadFile(filename)
	if err != nil {
		return nil, err
	}
	
	lines := strings.Split(string(data), "\n")
	for _, line := range lines {
		line = strings.TrimSpace(line)
		if line == "" || strings.HasPrefix(line, "#") {
			continue
		}
		
		parts := strings.SplitN(line, "=", 2)
		if len(parts) == 2 {
			key := strings.TrimSpace(parts[0])
			value := strings.TrimSpace(parts[1])
			config[key] = value
		}
	}
	
	return config, nil
}

// 将map写回配置文件
func writeConfig(filename string, config map[string]string) error {
	var content strings.Builder
	
	for key, value := range config {
		content.WriteString(fmt.Sprintf("%s=%s\n", key, value))
	}
	
	return ioutil.WriteFile(filename, []byte(content.String()), 0644)
}

func main() {
	// 读取配置文件
	config, err := readConfig("config.txt")
	if err != nil {
		fmt.Println("读取文件错误:", err)
		return
	}
	
	// 读取特定值到变量
	owneroftxt := config["owner"]
	fmt.Println("owner的值:", owneroftxt) // 输出: self
	
	// 修改变量值
	config["owner"] = "me"
	config["serverip"] = "192.168.1.100"
	
	// 验证修改
	fmt.Println("修改后的owner:", config["owner"]) // 输出: me
	
	// 将修改写回文件
	err = writeConfig("config.txt", config)
	if err != nil {
		fmt.Println("写入文件错误:", err)
		return
	}
	
	fmt.Println("配置文件已更新")
}

如果需要更结构化的方式,可以使用结构体:

package main

import (
	"fmt"
	"io/ioutil"
	"strings"
)

type Config struct {
	Name     string
	ServerIP string
	Owner    string
}

func parseConfig(filename string) (*Config, error) {
	config := &Config{}
	
	data, err := ioutil.ReadFile(filename)
	if err != nil {
		return nil, err
	}
	
	lines := strings.Split(string(data), "\n")
	for _, line := range lines {
		line = strings.TrimSpace(line)
		if line == "" {
			continue
		}
		
		parts := strings.SplitN(line, "=", 2)
		if len(parts) != 2 {
			continue
		}
		
		key := strings.TrimSpace(parts[0])
		value := strings.TrimSpace(parts[1])
		
		switch key {
		case "name":
			config.Name = value
		case "serverip":
			config.ServerIP = value
		case "owner":
			config.Owner = value
		}
	}
	
	return config, nil
}

func saveConfig(filename string, config *Config) error {
	content := fmt.Sprintf("name=%s\nserverip=%s\nowner=%s\n", 
		config.Name, config.ServerIP, config.Owner)
	return ioutil.WriteFile(filename, []byte(content), 0644)
}

func main() {
	// 解析配置文件
	config, err := parseConfig("config.txt")
	if err != nil {
		fmt.Println("错误:", err)
		return
	}
	
	// 读取owner到变量
	owneroftxt := config.Owner
	fmt.Println("当前owner:", owneroftxt)
	
	// 修改owner值
	config.Owner = "me"
	
	// 验证修改
	fmt.Println("新owner:", config.Owner)
	
	// 保存修改
	err = saveConfig("config.txt", config)
	if err != nil {
		fmt.Println("保存错误:", err)
		return
	}
}

如果文件较大或需要更高效的解析,可以使用bufio.Scanner

package main

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

func updateConfigValue(filename, key, newValue string) error {
	// 读取文件
	file, err := os.Open(filename)
	if err != nil {
		return err
	}
	defer file.Close()
	
	var lines []string
	scanner := bufio.NewScanner(file)
	
	for scanner.Scan() {
		line := scanner.Text()
		if strings.HasPrefix(strings.TrimSpace(line), key+"=") {
			line = key + "=" + newValue
		}
		lines = append(lines, line)
	}
	
	if err := scanner.Err(); err != nil {
		return err
	}
	
	// 写回文件
	output := strings.Join(lines, "\n")
	return os.WriteFile(filename, []byte(output), 0644)
}

func main() {
	// 修改owner的值
	err := updateConfigValue("config.txt", "owner", "me")
	if err != nil {
		fmt.Println("错误:", err)
		return
	}
	
	// 读取验证
	file, _ := os.Open("config.txt")
	defer file.Close()
	
	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		line := scanner.Text()
		if strings.HasPrefix(line, "owner=") {
			parts := strings.SplitN(line, "=", 2)
			if len(parts) == 2 {
				fmt.Println("owner当前值:", parts[1])
			}
		}
	}
}

这些示例展示了如何读取、修改和保存键值对格式的文本文件。第一种方法使用map适合动态键,第二种方法使用结构体适合固定格式,第三种方法直接逐行处理适合大文件。

回到顶部