Golang从文本文件创建结构体并转换为JSON

Golang从文本文件创建结构体并转换为JSON 你好!我有一个包含多行的无组织文本文件。我需要将这个文本文件转换为 JSON 文件。 文本文件示例:

value       value
value              value             value    value
value                         value   valu    value value
.... (以此类推)

将上述文本文件转换为 JSON 后将是: { “row1”: { “value1”:value “value2”:value } “row2”: { “value1”:value “value2”:value “value3”:value “value4”:value } “row3”: { “value1”:value “value2”:value “value3”:value “value4”:value “value5”:value }

首先,我必须创建一个动态结构体,然后转换为 JSON,请帮忙。


更多关于Golang从文本文件创建结构体并转换为JSON的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

是否可以使用切片? 使用空格分割每一行,然后使用空格修剪每个段,之后你可以使用一个结构体

type Row struct {
Index int
Name string
Values []int
}

或者一个映射

map[string][]int

更多关于Golang从文本文件创建结构体并转换为JSON的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


package main

import (
	"encoding/json"
	"fmt"
	"os"
	"strings"
)

// 动态结构体使用map实现
func processTextFile(inputFile, outputFile string) error {
	// 读取文本文件
	data, err := os.ReadFile(inputFile)
	if err != nil {
		return err
	}

	// 按行分割
	lines := strings.Split(string(data), "\n")
	result := make(map[string]map[string]string)

	// 处理每一行
	for i, line := range lines {
		if strings.TrimSpace(line) == "" {
			continue
		}

		// 分割每行的值(按空白字符分割)
		values := strings.Fields(line)
		rowMap := make(map[string]string)

		// 为每个值创建键
		for j, val := range values {
			key := fmt.Sprintf("value%d", j+1)
			rowMap[key] = val
		}

		// 添加到结果中
		rowKey := fmt.Sprintf("row%d", i+1)
		result[rowKey] = rowMap
	}

	// 转换为JSON
	jsonData, err := json.MarshalIndent(result, "", "  ")
	if err != nil {
		return err
	}

	// 写入输出文件
	return os.WriteFile(outputFile, jsonData, 0644)
}

func main() {
	// 示例使用
	err := processTextFile("input.txt", "output.json")
	if err != nil {
		fmt.Printf("处理失败: %v\n", err)
		return
	}
	fmt.Println("转换完成")
}
// 如果需要更灵活的处理(值可能包含空格)
func processTextFileAdvanced(inputFile, outputFile string) error {
	data, err := os.ReadFile(inputFile)
	if err != nil {
		return err
	}

	lines := strings.Split(string(data), "\n")
	result := make(map[string]interface{})

	for i, line := range lines {
		line = strings.TrimSpace(line)
		if line == "" {
			continue
		}

		// 使用正则表达式分割,保留连续空白作为分隔符
		values := strings.Fields(line)
		rowData := make(map[string]string)

		for j, value := range values {
			rowData[fmt.Sprintf("value%d", j+1)] = value
		}

		result[fmt.Sprintf("row%d", i+1)] = rowData
	}

	jsonData, err := json.MarshalIndent(result, "", "  ")
	if err != nil {
		return err
	}

	return os.WriteFile(outputFile, jsonData, 0644)
}
// 使用结构体切片的方式
type RowData struct {
	Values map[string]string `json:"values"`
}

func processWithStruct(inputFile, outputFile string) error {
	data, err := os.ReadFile(inputFile)
	if err != nil {
		return err
	}

	lines := strings.Split(string(data), "\n")
	var rows []RowData

	for _, line := range lines {
		line = strings.TrimSpace(line)
		if line == "" {
			continue
		}

		values := strings.Fields(line)
		rowMap := make(map[string]string)

		for i, val := range values {
			rowMap[fmt.Sprintf("value%d", i+1)] = val
		}

		rows = append(rows, RowData{Values: rowMap})
	}

	// 转换为JSON
	jsonData, err := json.MarshalIndent(rows, "", "  ")
	if err != nil {
		return err
	}

	return os.WriteFile(outputFile, jsonData, 0644)
}

这些代码示例展示了三种不同的方法将文本文件转换为JSON。第一种方法使用嵌套的map结构,第二种方法提供了更灵活的处理方式,第三种方法使用结构体切片。所有方法都能处理动态数量的值,并自动生成相应的JSON键名。

回到顶部