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特性之数组与切片的问题

    go特性之数组与切片的问题

    这篇文章主要介绍了go特性之数组与切片的问题,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-11-11
  • Go设计模式之中介者模式讲解和代码示例

    Go设计模式之中介者模式讲解和代码示例

    中介者是一种行为设计模式,让程序组件通过特殊的中介者对象进行间接沟通,达到减少组件之间依赖关系的目的,因此本文就给大家详细介绍一下Go中介者模式,需要的朋友可以参考下
    2023-06-06
  • Go设置http请求超时的方法实现

    Go设置http请求超时的方法实现

    这篇文章主要介绍了Go设置http请求超时的方法实现,最近接手了一个老项目进行维护,发现其中有个关于 http 请求的方法设置的 timeout 没有生效,很奇怪,一开始查看代码并没有发现什么可疑点,后查看了源码,打断点调试才发现问题所在,这里简单记录复盘一下
    2024-08-08
  • golang实现给图片加水印

    golang实现给图片加水印

    这篇文章主要为大家详细介绍了Vue3如何利用golang实现给图片加水印,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
    2023-12-12
  • Go实现字符串与数字的高效转换

    Go实现字符串与数字的高效转换

    在软件开发的世界里,数据类型转换是一项基础而重要的技能,尤其在Go语言这样类型严格的语言中,正确高效地进行类型转换对于性能优化和代码质量至关重要,本文给大家介绍了Go实现字符串与数字的高效转换,需要的朋友可以参考下
    2024-02-02
  • golang实现unicode转换为字符串string的方法

    golang实现unicode转换为字符串string的方法

    这篇文章主要介绍了golang实现unicode转换为字符串string的方法,实例分析了Go语言编码转换的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • 一文带你搞懂Golang依赖注入的设计与实现

    一文带你搞懂Golang依赖注入的设计与实现

    在现代的 web 框架里面,基本都有实现了依赖注入的功能,可以让我们很方便地对应用的依赖进行管理。今天我们来看看 go 里面实现依赖注入的一种方式,感兴趣的可以了解一下
    2023-01-01
  • Golang中结构体映射mapstructure库深入详解

    Golang中结构体映射mapstructure库深入详解

    mapstructure用于将通用的map[string]interface{}解码到对应的 Go 结构体中,或者执行相反的操作。很多时候,解析来自多种源头的数据流时,我们一般事先并不知道他们对应的具体类型。只有读取到一些字段之后才能做出判断
    2023-01-01
  • go语言更高精度的Sleep实例解析

    go语言更高精度的Sleep实例解析

    这篇文章主要为大家介绍了go语言更高精度的Sleep实例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Go实现map并发安全的3种方式总结

    Go实现map并发安全的3种方式总结

    Go的原生map不是并发安全的,在多协程读写同一个map的时候,安全性无法得到保障,这篇文章主要给大家总结介绍了关于Go实现map并发安全的3种方式,需要的朋友可以参考下
    2023-10-10

最新评论