From 349b66cb520a032fbacb9577ef85dd7e792cceb5 Mon Sep 17 00:00:00 2001 From: René 'Necoro' Neumann Date: Tue, 25 Jan 2022 00:14:41 +0100 Subject: Slight restructuring --- input.go | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 input.go (limited to 'input.go') diff --git a/input.go b/input.go new file mode 100644 index 0000000..206d99f --- /dev/null +++ b/input.go @@ -0,0 +1,89 @@ +package main + +import ( + "encoding/csv" + "fmt" + "os" + "strings" + + "github.com/jszwec/csvutil" +) + +type Participant struct { + LastName string `csv:"lastname"` + FirstName string `csv:"firstname"` + DateOfBirth string `csv:"dateofbirth"` + Gender Gender `csv:"gender"` + Nation string `csv:"nation"` + Region string `csv:"region"` + ClubStr string `csv:"club"` + Id uint `csv:"-"` + ClubId uint `csv:"-"` +} + +type Club struct { + Name string + Id uint +} + +func (p Participant) MainClub() string { + if strings.Contains(p.ClubStr, ", ") { + return strings.Split(p.ClubStr, ", ")[0] + } + return p.ClubStr +} + +func parseOphardtInput(fileName string) ([]Participant, []Club, error) { + f, err := os.Open(fileName) + if err != nil { + return nil, nil, fmt.Errorf("opening input file '%s': %w", fileName, err) + } + + encReader, err := encodedReader(f) + if err != nil { + return nil, nil, fmt.Errorf("cannot determine encoding of file '%s': %w", fileName, err) + } + + csvReader := csv.NewReader(encReader) + csvReader.Comma = ';' + + dec, err := csvutil.NewDecoder(csvReader) + if err != nil { + return nil, nil, fmt.Errorf("reading from file '%s': %w", fileName, err) + } + dec.DisallowMissingColumns = true + + var participants []Participant + if err = dec.Decode(&participants); err != nil { + return nil, nil, fmt.Errorf("decoding file '%s': %w", fileName, err) + } + + clubs := prepareParticipants(participants) + return participants, clubs, nil +} + +func prepareParticipants(participants []Participant) []Club { + clubMap := map[string]uint{} + var clubs []Club + var clubId, participantId uint + + for i := range participants { + participantId++ + + p := &participants[i] + p.Id = participantId + + club := p.MainClub() + if cId, ok := clubMap[club]; ok { + p.ClubId = cId + } else { + clubId++ + + p.ClubId = clubId + clubMap[club] = clubId + clubs = append(clubs, Club{club, clubId}) + } + } + + return clubs +} -- cgit v1.2.3-54-g00ecf