Go來合并兩個csv的實現(xiàn)示例
背景
通常我們處理文件都是用python+pandas,確實很香。但是今天突然有人找我用go寫一個合并兩個csv文件的,需要將兩個csv按id進行合并,大致如下圖

思路很簡單,先讀入兩個csv文件,然后遍歷比較id,如果相同就把另一個文件的內(nèi)容加到第一個中。然后創(chuàng)建merge.csv,將上一步得到的數(shù)據(jù)寫入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("合并已完成!")
}


優(yōu)化
對于小數(shù)據(jù)量這樣是沒有問題,但是一旦數(shù)據(jù)量增大,不僅讀取的內(nèi)存占用增加,而且遍歷比較會很消耗時間。所以優(yōu)化的話我們可以以行讀取,并且想辦法使用go的goroutine來增加速度。唉,太久沒怎么寫go了,一開始切片都有點忘了。
到此這篇關(guān)于Go來合并兩個csv的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)Go合并csv內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go實現(xiàn)字符串與數(shù)字的高效轉(zhuǎn)換
在軟件開發(fā)的世界里,數(shù)據(jù)類型轉(zhuǎn)換是一項基礎(chǔ)而重要的技能,尤其在Go語言這樣類型嚴(yán)格的語言中,正確高效地進行類型轉(zhuǎn)換對于性能優(yōu)化和代碼質(zhì)量至關(guān)重要,本文給大家介紹了Go實現(xiàn)字符串與數(shù)字的高效轉(zhuǎn)換,需要的朋友可以參考下2024-02-02
golang實現(xiàn)unicode轉(zhuǎn)換為字符串string的方法
這篇文章主要介紹了golang實現(xiàn)unicode轉(zhuǎn)換為字符串string的方法,實例分析了Go語言編碼轉(zhuǎn)換的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2016-07-07
一文帶你搞懂Golang依賴注入的設(shè)計與實現(xiàn)
在現(xiàn)代的 web 框架里面,基本都有實現(xiàn)了依賴注入的功能,可以讓我們很方便地對應(yīng)用的依賴進行管理。今天我們來看看 go 里面實現(xiàn)依賴注入的一種方式,感興趣的可以了解一下2023-01-01
Golang中結(jié)構(gòu)體映射mapstructure庫深入詳解
mapstructure用于將通用的map[string]interface{}解碼到對應(yīng)的 Go 結(jié)構(gòu)體中,或者執(zhí)行相反的操作。很多時候,解析來自多種源頭的數(shù)據(jù)流時,我們一般事先并不知道他們對應(yīng)的具體類型。只有讀取到一些字段之后才能做出判斷2023-01-01
Go實現(xiàn)map并發(fā)安全的3種方式總結(jié)
Go的原生map不是并發(fā)安全的,在多協(xié)程讀寫同一個map的時候,安全性無法得到保障,這篇文章主要給大家總結(jié)介紹了關(guān)于Go實現(xiàn)map并發(fā)安全的3種方式,需要的朋友可以參考下2023-10-10

