2024-04-13 14:22:28 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2024-04-13 15:10:50 +00:00
|
|
|
"encoding/csv"
|
2024-04-13 14:22:28 +00:00
|
|
|
"fmt"
|
2024-04-13 15:10:50 +00:00
|
|
|
"os"
|
2024-04-13 15:19:35 +00:00
|
|
|
"strconv"
|
2024-04-13 15:10:50 +00:00
|
|
|
"strings"
|
2024-04-13 14:22:28 +00:00
|
|
|
)
|
|
|
|
|
2024-04-13 18:44:00 +00:00
|
|
|
type State struct {
|
2024-04-13 19:07:29 +00:00
|
|
|
Name string
|
|
|
|
Votes int
|
|
|
|
VictoriousPartyPerElection map[string]string
|
2024-04-13 15:10:50 +00:00
|
|
|
}
|
|
|
|
|
2024-04-13 18:44:00 +00:00
|
|
|
func readStates() ([]State, error) {
|
|
|
|
var states map[string]State = make(map[string]State)
|
2024-04-13 15:19:35 +00:00
|
|
|
|
2024-04-13 18:44:00 +00:00
|
|
|
/* Electoral college votes for the 2024 election*/
|
2024-04-13 18:55:57 +00:00
|
|
|
votes_file, err := os.Open("data/electoral-college-votes.csv")
|
2024-04-13 15:10:50 +00:00
|
|
|
if err != nil {
|
2024-04-13 16:42:13 +00:00
|
|
|
return nil, fmt.Errorf("error opening the votes file: %v", err)
|
2024-04-13 15:10:50 +00:00
|
|
|
}
|
2024-04-13 18:55:57 +00:00
|
|
|
defer votes_file.Close()
|
|
|
|
|
|
|
|
votes_reader := csv.NewReader(votes_file)
|
|
|
|
if _, err := votes_reader.Read(); err != nil { // Skip header
|
2024-04-13 16:42:13 +00:00
|
|
|
return nil, fmt.Errorf("error reading votes header: %v", err)
|
2024-04-13 15:19:35 +00:00
|
|
|
}
|
2024-04-13 15:10:50 +00:00
|
|
|
for {
|
2024-04-13 18:55:57 +00:00
|
|
|
csv_record, err := votes_reader.Read()
|
2024-04-13 15:10:50 +00:00
|
|
|
if err != nil {
|
2024-04-13 16:42:13 +00:00
|
|
|
break // EOF or an error
|
2024-04-13 15:10:50 +00:00
|
|
|
}
|
2024-04-13 18:55:57 +00:00
|
|
|
votes, err := strconv.Atoi(csv_record[1])
|
2024-04-13 15:19:35 +00:00
|
|
|
if err != nil {
|
2024-04-13 16:42:13 +00:00
|
|
|
continue // Error in converting votes, skip this record
|
2024-04-13 15:19:35 +00:00
|
|
|
}
|
2024-04-13 18:55:57 +00:00
|
|
|
state := csv_record[0]
|
2024-04-13 18:44:00 +00:00
|
|
|
if _, exists := states[state]; !exists {
|
2024-04-13 19:07:29 +00:00
|
|
|
states[state] = State{Name: state, Votes: votes, VictoriousPartyPerElection: make(map[string]string)}
|
2024-04-13 15:10:50 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-04-13 16:42:13 +00:00
|
|
|
/* Election results */
|
2024-04-13 19:07:29 +00:00
|
|
|
var years = []string{"2000", "2004", "2008", "2012", "2016", "2020"}
|
2024-04-13 16:42:13 +00:00
|
|
|
for _, year := range years {
|
2024-04-13 18:55:57 +00:00
|
|
|
results_filename := fmt.Sprintf("data/results/%s.csv", year)
|
|
|
|
results_file, err := os.Open(results_filename)
|
2024-04-13 16:35:52 +00:00
|
|
|
if err != nil {
|
2024-04-13 16:42:13 +00:00
|
|
|
return nil, fmt.Errorf("error opening the results file for %s: %v", year, err)
|
|
|
|
}
|
2024-04-13 18:55:57 +00:00
|
|
|
defer results_file.Close()
|
|
|
|
resultsReader := csv.NewReader(results_file)
|
2024-04-13 16:42:13 +00:00
|
|
|
if _, err := resultsReader.Read(); err != nil { // Skip header
|
|
|
|
return nil, fmt.Errorf("error reading results header for %s: %v", year, err)
|
|
|
|
}
|
|
|
|
for {
|
|
|
|
record, err := resultsReader.Read()
|
|
|
|
if err != nil {
|
|
|
|
break // EOF or an error
|
|
|
|
}
|
|
|
|
state, party := record[0], record[1]
|
2024-04-13 18:44:00 +00:00
|
|
|
data, exists := states[state]
|
2024-04-13 16:42:13 +00:00
|
|
|
if !exists {
|
|
|
|
continue // State not found in votes map, skip
|
|
|
|
}
|
|
|
|
// Update the party winning in the specific year
|
2024-04-13 19:07:29 +00:00
|
|
|
data.VictoriousPartyPerElection[year] = party
|
2024-04-13 18:44:00 +00:00
|
|
|
states[state] = data
|
2024-04-13 16:35:52 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-04-13 16:42:13 +00:00
|
|
|
// Convert statesData map to a slice for returning
|
2024-04-13 19:07:29 +00:00
|
|
|
var states_slice []State
|
|
|
|
for _, state := range states {
|
|
|
|
states_slice = append(states_slice, state)
|
2024-04-13 16:35:52 +00:00
|
|
|
}
|
|
|
|
|
2024-04-13 19:07:29 +00:00
|
|
|
return states_slice, nil
|
2024-04-13 16:35:52 +00:00
|
|
|
}
|
|
|
|
|
2024-04-13 18:44:00 +00:00
|
|
|
type VotesForEachParty struct {
|
|
|
|
Democrats int
|
|
|
|
Republicans int
|
|
|
|
}
|
|
|
|
|
|
|
|
func sampleFromState(state State) VotesForEachParty {
|
|
|
|
switch state.Name {
|
|
|
|
case "Nebraska":
|
|
|
|
return VotesForEachParty{Democrats: 1, Republicans: 0}
|
|
|
|
case "Maine":
|
|
|
|
return VotesForEachParty{Democrats: 1, Republicans: 0}
|
|
|
|
default:
|
|
|
|
return VotesForEachParty{Democrats: 1, Republicans: 0}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-04-13 14:22:28 +00:00
|
|
|
func main() {
|
2024-04-13 18:44:00 +00:00
|
|
|
states, err := readStates()
|
2024-04-13 15:10:50 +00:00
|
|
|
if err != nil {
|
|
|
|
fmt.Println("Error:", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// Example states to query
|
2024-04-13 18:44:00 +00:00
|
|
|
example_state_names := []string{"California", "Texas", "Florida"}
|
2024-04-13 19:07:29 +00:00
|
|
|
|
|
|
|
for _, state := range states {
|
2024-04-13 18:44:00 +00:00
|
|
|
for _, example_state_name := range example_state_names {
|
2024-04-13 19:07:29 +00:00
|
|
|
if strings.EqualFold(state.Name, example_state_name) {
|
|
|
|
fmt.Printf("%s: Votes: %d, Winners: ", state.Name, state.Votes)
|
|
|
|
for year, party := range state.VictoriousPartyPerElection {
|
|
|
|
fmt.Printf("[%s: %s] ", year, party)
|
|
|
|
}
|
|
|
|
fmt.Println()
|
2024-04-13 16:42:13 +00:00
|
|
|
break
|
|
|
|
}
|
2024-04-13 16:35:52 +00:00
|
|
|
}
|
|
|
|
}
|
2024-04-13 19:07:29 +00:00
|
|
|
|
2024-04-13 14:22:28 +00:00
|
|
|
}
|