2016-08-22 6 views
0

Golangに新しく、特定の列の値が別の行と一致する場合にCSVで重複を削除する方法を理解するのに苦労します。golang csv列の値が一致した場合に重複を削除します

マイテーブルには3つの列があります 名前|バンド|年

人名が2つ以上表示されている場合は、それらを一度出力するだけです。

forループですべての詳細を出力できただけなので、新しい配列にプッシュして比較する必要があると思いますか?

+0

のようになりますmap[string]bool使用することができそう芋、スライスに名前のみをプッシュします( '[] string')を繰り返します。これにより、マップのオーバーヘッドを避けることができますが、より多くの反復処理が必要になります。私は、ベンチマークが地図と文字列のソリューションをどのように比較しているのだろうか... – Plato

答えて

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

比較するには、map[string]boolのキーとして名前を使用する方がよいでしょう。

これにより、評価する新しい行ごとに、以前に追加したすべての行をループする必要がなくなります。

0

あなたのコードは、この

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 
    } 
}  
関連する問題