如果匹配列值,则golang csv删除重复项

时间:2016-08-22 19:04:48

标签: csv go

Golang的新手,如果某个特定的列值与其他行匹配,那么很难弄清楚如何删除CSV中的重复项。

我的表有3列 名字|乐队|一年

如果人名出现两次或更多,我只想让他们输出一次。

我只能在for循环中输出所有细节,所以我猜我需要推送到一个新数组并从中进行比较?

3 个答案:

答案 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
    }
}