Go来合并两个csv的实现示例

 更新时间:2021年10月28日 09:47:37   作者:shelgi  
本文主要介绍了Go来合并两个csv的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

背景

通常我们处理文件都是用python+pandas,确实很香。但是今天突然有人找我用go写一个合并两个csv文件的,需要将两个csv按id进行合并,大致如下图

思路很简单,先读入两个csv文件,然后遍历比较id,如果相同就把另一个文件的内容加到第一个中。然后创建merge.csv,将上一步得到的数据写入csv即可。

代码部分

package main

import (
 "encoding/csv"
 "log"
 "os"

 "fmt"
)

func join(fileName1 string, fileName2 string) (row [][]string) {
 fs1, _ := os.Open(fileName1)
 r1 := csv.NewReader(fs1)
 content1, err := r1.ReadAll()
 if err != nil {
  log.Fatalf("can not readall, err is %+v", err)
 }

 fs2, _ := os.Open(fileName2)
 r2 := csv.NewReader(fs2)
 content2, err := r2.ReadAll()
 if err != nil {
  log.Fatalf("can not readall, err is %+v", err)
 }
 row = make([][]string, len(content1[1:]))

 for i, row1 := range content1[1:] {
  for _, row2 := range content2[1:] {
   if row1[0] == row2[0] {
    row[i] = append(row[i], row1[0], row1[1], row1[2], row2[1], row2[2])
   }
  }
 }
 return
}

func edit(filename string, row [][]string) {
 f, err := os.Create(filename)
 if err != nil {
  panic(err)
 }
 defer f.Close()

 //防止乱码
 f.WriteString("\xEF\xBB\xBF")
 w := csv.NewWriter(f)
 w.Write([]string{"ID", "name", "gender", "course", "score"})
 w.WriteAll(row)
 w.Flush()
}

func main() {
 row := join("1.csv", "2.csv")
 fmt.Println(row)
 edit("join.csv", row)
 fmt.Println("合并已完成!")
}

优化

对于小数据量这样是没有问题,但是一旦数据量增大,不仅读取的内存占用增加,而且遍历比较会很消耗时间。所以优化的话我们可以以行读取,并且想办法使用go的goroutine来增加速度。唉,太久没怎么写go了,一开始切片都有点忘了。

到此这篇关于Go来合并两个csv的实现示例的文章就介绍到这了,更多相关Go合并csv内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go 1.21.0 新增结构化日志记录标准库log/slog使用详解

    Go 1.21.0 新增结构化日志记录标准库log/slog使用详解

    这篇文章主要为大家介绍了Go 1.21.0 新增结构化日志记录标准库log/slog使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • Go语言实战学习之流程控制详解

    Go语言实战学习之流程控制详解

    这篇文章主要为大家详细介绍了Go语言中的流程控制,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助 ,需要的朋友可以参考下
    2022-08-08
  • Go语言编译原理之源码调试

    Go语言编译原理之源码调试

    这篇文章主要为大家介绍了Go语言编译原理之源码调试示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Go map发生内存泄漏解决方法

    Go map发生内存泄漏解决方法

    这篇文章主要介绍了Go map发生内存泄漏解决方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Go pprof内存指标含义备忘录及案例分析

    Go pprof内存指标含义备忘录及案例分析

    这篇文章主要介绍了Go pprof内存指标含义备忘录问题,小编特此把问题及案例分享到脚本之家平台供大家学习,需要的朋友可以参考下
    2020-03-03
  • 使用Golang实现对网络数据包的捕获与分析

    使用Golang实现对网络数据包的捕获与分析

    在网络通信中,网络数据包是信息传递的基本单位,抓包是一种监控和分析网络流量的方法,用于获取网络数据包并对其进行分析,本文将介绍如何使用Golang实现抓包功能,包括网络数据包捕获和数据包分析,需要的朋友可以参考下
    2023-11-11
  • Go1.18新特性工作区模糊测试及泛型的使用详解

    Go1.18新特性工作区模糊测试及泛型的使用详解

    这篇文章主要为大家介绍了Go 1.18新特性中的工作区 模糊测试 泛型使用进行详细讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • go语言制作一个gif动态图

    go语言制作一个gif动态图

    这篇文章主要介绍了go制作一个gif动态图的相关资料,需要的朋友可以参考下
    2015-03-03
  • Go语言使用MongoDB数据库详细步骤

    Go语言使用MongoDB数据库详细步骤

    mongodb是一种高性能、开源、文档型的nosql数据库,被广泛应用于web应用、大数据以及云计算领域,下面这篇文章主要给大家介绍了关于Go语言使用MongoDB数据库的详细步骤,需要的朋友可以参考下
    2024-05-05
  • go语言调用其他包中的函数简单示例

    go语言调用其他包中的函数简单示例

    这篇文章主要给大家介绍了关于go语言调用其他包中的函数的相关资料,文中还介绍了Go语言同一个包中不同文件之间函数调用的相关问题,需要的朋友可以参考下
    2023-01-01

最新评论