如何使用Golang将无规则分隔的表格转换为JSON?
用Golang将不规则分隔的表格转换为JSON数组
针对表格列分隔无固定规律(混合空格、制表符)且含空字段的场景,可通过以下步骤实现转换:
核心思路
- 解析表头确定字段数量与名称
- 逐行处理数据,用正则分割任意空白得到字段值,补全空字段以匹配表头列数
- 将字段映射到结构体,最终序列化为JSON数组
完整示例代码
package main import ( "encoding/json" "fmt" "regexp" "strings" ) // 定义与表格字段对应的结构体,JSON标签指定输出键名 type Record struct { State string `json:"state"` Version string `json:"version"` Status string `json:"status"` Comment string `json:"comment"` } func main() { // 示例表格内容(模拟不规则分隔、空字段) tableContent := `State Version Status Comment NY 2.0.1 active CA 1.3.0 "needs update" TX inactive WA 1.5.2 pending "in progress"` // 按行拆分内容 lines := strings.Split(tableContent, "\n") if len(lines) < 1 { fmt.Println("表格内容为空") return } // 处理表头:分割得到字段名,确定列数 headerLine := strings.TrimSpace(lines[0]) headers := regexp.MustCompile(`\s+`).Split(headerLine, -1) colCount := len(headers) if colCount == 0 { fmt.Println("表头无效") return } var records []Record // 遍历处理每一行数据 for _, line := range lines[1:] { trimmedLine := strings.TrimSpace(line) if trimmedLine == "" { continue // 跳过空行 } // 用正则分割任意空白(空格、制表符、连续空白) fields := regexp.MustCompile(`\s+`).Split(trimmedLine, -1) // 补全空字段,确保字段数与表头一致 for len(fields) < colCount { fields = append(fields, "") } // 若分割后字段数超出表头列数,取前colCount个(可根据实际需求调整) if len(fields) > colCount { fields = fields[:colCount] } // 构造记录,处理带引号的字段(如Comment) record := Record{ State: fields[0], Version: fields[1], Status: fields[2], Comment: strings.Trim(fields[3], `"`), } records = append(records, record) } // 序列化为格式化后的JSON jsonData, err := json.MarshalIndent(records, "", " ") if err != nil { fmt.Printf("JSON序列化失败: %v\n", err) return } fmt.Println(string(jsonData)) }
关键细节说明
- 不规则分隔处理:用
regexp.MustCompile(\s+)匹配任意数量的空白字符(空格、制表符),避免固定分隔符的局限性 - 空字段补全:确保每一行的字段数与表头列数一致,避免结构体赋值时索引越界
- 字段清洗:用
strings.TrimSpace去除行首尾空白,用strings.Trim处理字段可能带的引号 - 文件读取适配:如果表格来自文件,可替换为
bufio.Scanner逐行读取,逻辑与上述代码一致
输出示例
运行代码后会得到如下JSON数组:
[ { "state": "NY", "version": "2.0.1", "status": "active", "comment": "" }, { "state": "CA", "version": "1.3.0", "status": "", "comment": "needs update" }, { "state": "TX", "version": "", "status": "inactive", "comment": "" }, { "state": "WA", "version": "1.5.2", "status": "pending", "comment": "in progress" } ]
内容的提问来源于stack exchange,提问作者Raiane Dev
相关产品推荐
相关产品推荐

