diff options
author | René 'Necoro' Neumann <necoro@necoro.eu> | 2022-01-25 00:14:41 +0100 |
---|---|---|
committer | René 'Necoro' Neumann <necoro@necoro.eu> | 2022-01-25 00:14:41 +0100 |
commit | 349b66cb520a032fbacb9577ef85dd7e792cceb5 (patch) | |
tree | a18171d0d353d1e0122eaaa662392959fc7dba47 /input.go | |
parent | ab5efc3a4320f81a55f21d1f78c222b704feeae8 (diff) | |
download | engarde-importer-349b66cb520a032fbacb9577ef85dd7e792cceb5.tar.gz engarde-importer-349b66cb520a032fbacb9577ef85dd7e792cceb5.tar.bz2 engarde-importer-349b66cb520a032fbacb9577ef85dd7e792cceb5.zip |
Slight restructuring
Diffstat (limited to 'input.go')
-rw-r--r-- | input.go | 89 |
1 files changed, 89 insertions, 0 deletions
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 +} |