Golang的新手,如果某个特定的列值与其他行匹配,那么很难弄清楚如何删除CSV中的重复项。
我的表有3列 名字|乐队|一年
如果人名出现两次或更多,我只想让他们输出一次。
我只能在for循环中输出所有细节,所以我猜我需要推送到一个新数组并从中进行比较?
答案 0 :(得分:1)
添加到@ Kul的回答:
// 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)
}
}
答案 1 :(得分:0)
要进行比较,最好将名称用作map[string]bool
中的键。
这样,对于您评估的每一个新行,您都不必遍历所有以前添加的行。
答案 2 :(得分: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
}
}