2016-08-22 140 views
0

Golang的新手,並努力弄清楚如果特定的列值與另一行匹配,如何刪除CSV中的重複項。golang csv刪除重複如果匹配的列值

我的表有3列 名稱| band |年

如果一個人的名字出現兩次或多次,我只希望他們輸出一次。

我只能夠輸出for循環中的所有細節,所以我猜我需要推到一個新的數組,並從中比較?

+0

是海事組織,推只有名稱到一個片( '[] string')然後迭代。這可以避免地圖的開銷,但是您將不得不迭代更多。我想知道如何比較地圖和字符串解決方案之間的基準測試... – Plato

回答

1

添加到@庫爾的回答是:

// 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) 
    } 
} 
0

要進行比較,最好在map[string]bool中使用名稱作爲關鍵字。

通過這種方式,您無需遍歷所有以前添加的行,即可查看您評估的每一行。

0

正如@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 
    } 
}