Golang的新手,並努力弄清楚如果特定的列值與另一行匹配,如何刪除CSV中的重複項。golang csv刪除重複如果匹配的列值
我的表有3列 名稱| band |年
如果一個人的名字出現兩次或多次,我只希望他們輸出一次。
我只能夠輸出for循環中的所有細節,所以我猜我需要推到一個新的數組,並從中比較?
Golang的新手,並努力弄清楚如果特定的列值與另一行匹配,如何刪除CSV中的重複項。golang csv刪除重複如果匹配的列值
我的表有3列 名稱| band |年
如果一個人的名字出現兩次或多次,我只希望他們輸出一次。
我只能夠輸出for循環中的所有細節,所以我猜我需要推到一個新的數組,並從中比較?
添加到@庫爾的回答是:
// i'm pretty sure struct{} is smaller in memory than bool:
known := make(map[string]struct{})
for name, band, year, err := parseMyLine(); err == nil; {
_, ok := known[name]
if !ok {
known[name]=struct{}{}
handleFirstSeenName(name, band, year)
}
}
要進行比較,最好在map[string]bool
中使用名稱作爲關鍵字。
通過這種方式,您無需遍歷所有以前添加的行,即可查看您評估的每一行。
正如@Kul提到的,您可以使用map[string]bool
你的代碼看起來應該是這樣
csvFile, err := os.Open("csvFile.csv")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer csvFile.Close()
reader := csv.NewReader(csvFile)
var name string
var band string
var year string
nameExistMap := make(map[string]bool)
csvRawData, err := reader.ReadAll()
if err != nil {
fmt.Println(err)
os.Exit(1)
}
for r, row := range csvRawData {
name = r[0]
band = r[1]
year = r[2]
if _, exist := nameExistmap[name]; exist {
continue
} else {
nameExistmap[name] = true
//Do Your Output Here
}
}
是海事組織,推只有名稱到一個片( '[] string')然後迭代。這可以避免地圖的開銷,但是您將不得不迭代更多。我想知道如何比較地圖和字符串解決方案之間的基準測試... – Plato