Go语言如何用csv.NewWriter在CSV中写入相邻列的两组数据?
如何用Go的csv.Writer将两组数据写入相邻列?
首先得明确:Go标准库的csv.Writer并没有提供类似普通Writer的“偏移”选项,但我们可以通过合并对应行的数据来实现你要的左右并排效果。
你当前的代码问题在于:每次调用writer.Write(value)都是写入一整行,所以先遍历dataset1写出来的是一列(每行一个单元格),再遍历dataset2写的是下面的另一列,自然是上下堆叠而不是左右相邻。
要实现并排显示,核心思路是把两组数据的对应行合并成一个切片,然后一次性写入这一行。举个具体的例子:
假设你的dataset1和dataset2都是[][]string类型(比如dataset1的每个元素是一行的列数据,dataset2同理),修改后的代码可以这样写:
package main import ( "encoding/csv" "os" ) func main() { csvOut, err := os.Create("Summary.csv") if err != nil { // 实际项目里建议换成更优雅的错误处理,比如返回错误 panic(err) } defer csvOut.Close() writer := csv.NewWriter(csvOut) defer writer.Flush() // 假设两组数据行数一致,直接合并对应行 for i := range dataset1 { // 把dataset1的当前行和dataset2的当前行合并成一个大切片 combinedRow := append(dataset1[i], dataset2[i]...) if err := writer.Write(combinedRow); err != nil { panic(err) } } }
如果两组数据的行数不一样,就得处理边界情况——比如其中一组数据提前写完了,后面的行要补上空字符串来对齐列数:
// 先确定两组数据中的最大行数 maxRows := len(dataset1) if len(dataset2) > maxRows { maxRows = len(dataset2) } // 提前获取两组数据的列数,用来补空字符串对齐 cols1 := 0 if len(dataset1) > 0 { cols1 = len(dataset1[0]) } cols2 := 0 if len(dataset2) > 0 { cols2 = len(dataset2[0]) } for i := 0; i < maxRows; i++ { var row []string // 处理dataset1的当前行,没有的话补空 if i < len(dataset1) { row = append(row, dataset1[i]...) } else { row = append(row, make([]string, cols1)...) } // 处理dataset2的当前行,没有的话补空 if i < len(dataset2) { row = append(row, dataset2[i]...) } else { row = append(row, make([]string, cols2)...) } if err := writer.Write(row); err != nil { panic(err) } }
这样就能保证两组数据始终是左右相邻的列,不会出现上下堆叠的情况啦。
内容的提问来源于stack exchange,提问作者Errorum
相关产品推荐
相关产品推荐

