Skip to content

Instantly share code, notes, and snippets.

@chrismetcalf
Created November 2, 2010 23:24
Show Gist options
  • Save chrismetcalf/660507 to your computer and use it in GitHub Desktop.
Save chrismetcalf/660507 to your computer and use it in GitHub Desktop.
A simple parser for King County voting result files
#!/usr/bin/env ruby
#
# A simple parser for parsing King County, WA vote results
PARTIES = {
"Dem" => "Democratic Party",
"DPC" => "Democratic Party",
"Rep" => "Republican Party",
"RPC" => "Republican Party",
"NOP" => "NOP",
"Ref" => "Reform Party",
"I" => "Independent",
"INO" => "Independent",
"IDM" => "Independent",
"G" => "Green Party",
"CTT" => "Centrist Party",
"PFX" => "Problemfixer Party"
}
class Candidate
attr_accessor :id, :name, :votes
def initialize(id, name, party, votes)
@id = id
@name = name
@party = party
@votes = votes
end
def party
PARTIES[@party] || @party
end
end
class Measure
attr_accessor :id, :name, :candidates
def initialize(id, name)
@id = id
@name = name
@candidates = []
end
def winner
@winner ||= @candidates.sort{|a, b| a.votes <=> b.votes}.last
end
def total_votes
@total_votes ||= @candidates.inject(0) {|m, c| m + c.votes}
end
end
measures = []
measure = nil
ARGF.each do |line|
# We're either reading a measure or votes
if line =~ /^\d+/
# We're reading a Measure
id, name = line.scan(/^(\d+)\s+\d+\s+"(.+)"/)[0]
if !id.nil? && !name.nil?
measure = Measure.new(id, name)
measures << measure
end
elsif line =~ /^\s+/
# We're reading a vote
id, name, party, votes = line.scan(/\s+(\d+)\s+\d+\s+"(.*)"\s+"(.*)"\s+\d+\s+(\d+)/)[0]
candidate = Candidate.new(id, name, party, votes.to_i)
measure.candidates << candidate unless measure.nil?
end
end
puts "Measure ID\tMeasure Name\tTotal Votes\tCandidate ID\tCandidate Name\tCandidate Party\tCandidate Votes"
measures.each do |m|
m.candidates.sort{|a,b| a.votes <=> b.votes}.reverse.each do |c|
puts "#{m.id}\t#{m.name}\t#{m.total_votes}\t#{c.id}\t#{c.name}\t#{c.party}\t#{c.votes}"
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment