英文:
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
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论