Golangに新しく、特定の列の値が別の行と一致する場合にCSVで重複を削除する方法を理解するのに苦労します。golang csv列の値が一致した場合に重複を削除します
マイテーブルには3つの列があります 名前|バンド|年
人名が2つ以上表示されている場合は、それらを一度出力するだけです。
forループですべての詳細を出力できただけなので、新しい配列にプッシュして比較する必要があると思いますか?
Golangに新しく、特定の列の値が別の行と一致する場合にCSVで重複を削除する方法を理解するのに苦労します。golang csv列の値が一致した場合に重複を削除します
マイテーブルには3つの列があります 名前|バンド|年
人名が2つ以上表示されている場合は、それらを一度出力するだけです。
forループですべての詳細を出力できただけなので、新しい配列にプッシュして比較する必要があると思いますか?
@クルの答えに追加する:@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)
}
}
比較するには、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
}
}
のようになります
map[string]bool
使用することができそう芋、スライスに名前のみをプッシュします( '[] string')を繰り返します。これにより、マップのオーバーヘッドを避けることができますが、より多くの反復処理が必要になります。私は、ベンチマークが地図と文字列のソリューションをどのように比較しているのだろうか... – Plato