Skip to content

Instantly share code, notes, and snippets.

@james
Created August 19, 2017 18:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save james/02d09a519d8e93a87d0ac7784d9f85a5 to your computer and use it in GitHub Desktop.
Save james/02d09a519d8e93a87d0ac7784d9f85a5 to your computer and use it in GitHub Desktop.
Example hacky code from the Jeremy Corbyn Labour leadership campaign 2015
require 'csv'
require 'date'
require 'chronic'
HEADERS_TO_KEEP = ['MembershipNumber', 'Title', 'LastName', 'PreferredFirstName', 'DateOfBirth', 'AddressLine1', 'AddressLine2', 'AddressLine3', 'Town', 'Country Code', 'County', 'PostCode', 'Email', 'MobilePhoneNumber', 'PhoneNumber', 'RegionName', 'ConstituencyName', 'TradeUnion', 'PrimaryStatus'] #, 'JoinedDate'
Dir.entries('to_convert')[2..999].each do |file|
members = CSV.read("to_convert/#{file}", headers: true, :encoding => 'windows-1251:utf-8')
# remove unused columns
members.headers.each do |header|
unless HEADERS_TO_KEEP.include?(header)
members.delete(header)
end
end
@registered = CSV.open("converted/registered.csv", 'w')
@member = CSV.open("converted/members.csv", 'w')
x = 1
members.each_slice(4000) do |slice|
CSV.open("converted/#{file}#{x}", 'w') do |csv|
slice.each do |row|
# Remove initials to avoid emails starting 'Dear G'
if row['PreferredFirstName'] && row['PreferredFirstName'].length == 1
row['PreferredFirstName'] = nil
end
if row['DateOfBirth'] && time = Chronic.parse(row['DateOfBirth'])
date = time.to_date
date = date.prev_year(100) if date > Date.today
row['DateOfBirth'] = date.strftime("%m/%d/%Y")
end
if row['PrimaryStatus'] == 'REGISTERED'
@registered.puts row
elsif row['PrimaryStatus'] == 'MEMBER'
@member.puts row
else
csv.puts row
end
end
end
x = x+1
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment