golang csv remove duplicate if matching column values

huangapple go评论117阅读模式
英文:

golang csv remove duplicate if matching column values

问题

我是你的中文翻译助手,以下是翻译好的内容:

刚开始学习Golang,正在努力弄清楚如何在CSV文件中删除重复项,如果某个列的值与其他行匹配。

我的表格有3列:
姓名 | 乐队 | 年份

如果一个人的姓名出现两次或更多,我只想输出一次。

我只能通过for循环输出所有的细节,所以我猜我需要将它们推到一个新的数组中,并从那里进行比较。

英文:

New to Golang and struggling to figure out how to remove duplicates in CSVs if a particular column value matches another rows.

My table has 3 columns
name | band | year

If a persons name appears twices or more I just want them to output them the once.

I have only been able to output all the details in a for loop so I am guessing I need to push to a new array and compare from that?

答案1

得分: 2

为了补充@Kul的答案:

// 我相信struct{}在内存中比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)
}
}

英文:

to add to @Kul's answer:

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

答案2

得分: 1

为了进行比较,最好使用名称作为map[string]bool中的键。

这样,你就不需要为每一行新添加的行遍历所有先前添加的行。

英文:

To do the comparison, it'll be better to use the names as keys in a map[string]bool.

This way you won't have to loop through all the previously added rows, for every new row you evaluate.

答案3

得分: 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 _, row := range csvRawData {
    name = row[0]
    band = row[1]
    year = row[2]

    if _, exist := nameExistMap[name]; exist {
        continue
    } else {
        nameExistMap[name] = true
        // 在这里进行输出操作
    }
}

请注意,我已经将代码中的nameExistmap更正为nameExistMap,以匹配变量的声明。

英文:

As @Kul mentioned, You can use map[string]bool Your code should look like this

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

huangapple
  • 本文由 发表于 2016年8月23日 03:04:47
  • 转载请务必保留本文链接:https://go.coder-hub.com/39086976.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定