I have a bunch of folks I want to export from Apple Contacts on MacOS and turn into a spreadsheet for a holiday card mail merge.
This is my clumsy way of doing it.
| require 'vpim' | |
| require 'csv' | |
| module Vpim | |
| class Vcard | |
| def full_name | |
| name.fullname.to_s | |
| end | |
| class Address | |
| def street_address | |
| ("%s, %s %s %s" % [street, locality, region, postalcode]).strip | |
| end | |
| end | |
| def street_address | |
| address ? address.street_address.to_s : nil | |
| end | |
| def email_address | |
| email.to_s | |
| end | |
| def phone_number | |
| telephone.to_s | |
| end | |
| def mail_merge_fields | |
| [full_name, street_address, email_address, phone_number] | |
| end | |
| end | |
| end | |
| output_filename = ARGV[0].nil? ? 'mail_merge_output.csv' : "#{File.basename(ARGV[0])}.csv" | |
| vcf = ARGV[0].nil? ? STDIN : open(ARGV[0]) | |
| cards = Vpim::Vcard.decode(vcf) | |
| csv_rows = [["Name", "Address", "Email", "Phone"]] + cards.map(&:mail_merge_fields) | |
| open(output_filename, "w") { |csv| | |
| csv.write(csv_rows.map(&:to_csv).join) | |
| } |