package main

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

type KeyValue struct {
	Path  string
	Value interface{}
}

func main() {
	// 打开输入的txt文件
	file, err := os.Open("input.txt")
	if err != nil {
		fmt.Println("无法打开文件:", err)
		return
	}
	defer file.Close()

	// 初始化顶级map
	result := make(map[string]interface{})

	// 逐行读取文件内容
	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		line := scanner.Text()
		if line == "" {
			continue
		}

		// 将每行按照 "path: ... , value: ..." 格式解析
		kv := parseLine(line)
		if kv != nil {
			// 将解析后的键值对插入到map中
			keys := strings.Split(kv.Path, ".")
			insertIntoMap(result, keys, kv.Value)
		}
	}

	// 检查读取文件时是否出错
	if err := scanner.Err(); err != nil {
		fmt.Println("读取文件时出错:", err)
		return
	}

	// 将结果转换为JSON格式
	jsonData, err := json.MarshalIndent(result, "", "  ")
	if err != nil {
		fmt.Println("生成JSON时出错:", err)
		return
	}

	// 将JSON保存到文件
	err = os.WriteFile("output.json", jsonData, 0644)
	if err != nil {
		fmt.Println("保存JSON文件时出错:", err)
		return
	}

	fmt.Println("JSON成功保存到 output.json 文件中")
}

// 解析每一行,提取 path 和 value
func parseLine(line string) *KeyValue {
	// 按照 "path: ... , value: ..." 分割
	parts := strings.Split(line, ", value:")
	if len(parts) != 2 {
		return nil
	}

	pathPart := strings.TrimPrefix(parts[0], "path:")
	valuePart := strings.TrimSpace(parts[1])

	// 尝试将值解析为整数,如果失败则存储为字符串
	var value interface{}
	if valuePart == "" {
		value = nil
	} else if v, err := parseValue(valuePart); err == nil {
		value = v
	} else {
		value = valuePart
	}

	return &KeyValue{
		Path:  strings.TrimSpace(pathPart),
		Value: value,
	}
}

// 尝试将字符串值解析为int类型
func parseValue(valueStr string) (interface{}, error) {
	if valueStr == "" {
		return nil, nil
	}
	return valueStr, nil
}

// 递归地将键插入到map中
func insertIntoMap(result map[string]interface{}, keys []string, value interface{}) {
	if len(keys) == 0 {
		return
	}

	key := keys[0]
	if len(keys) == 1 {
		// 最后一层,插入具体的值
		result[key] = value
	} else {
		if _, exists := result[key]; !exists {
			// 如果子map不存在,创建一个
			result[key] = make(map[string]interface{})
		}

		// 递归插入子项
		insertIntoMap(result[key].(map[string]interface{}), keys[1:], value)
	}
}

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐