Skip to content

Instantly share code, notes, and snippets.

@chorn
Created August 13, 2010 12:36
Show Gist options
  • Save chorn/522793 to your computer and use it in GitHub Desktop.
Save chorn/522793 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby
require "optparse"
require "tempfile"
require "rubygems"
require "roo"
require "fastercsv"
require "addressable/uri"
OptionParser.new do |opts|
opts.banner = "Usage: [options] <file1> [file2 ...]"
opts.on("-d", "--debug N", Integer, "Debug level") do |debug|
@debug = debug
end
opts.on("-D", "--destination [directory]", "An optional directory for output, defaults to same dir as input file.") do |dest|
unless File.directory?
puts "#{dest} is not a directory."
exit
end
unless File.writeable?
puts "#{dest} is not writeable."
exit
end
@dest = dest
end
opts.on_tail("-h", "--help", "Show this message") do
puts opts
exit
end
end.parse!(ARGV)
ARGV.each do |file_name|
unless File::readable? file_name
puts "#{file_name} is unreadable"
exit
end
end
ARGV.each do |file_name|
download = nil
if file_name =~ /^http/i and file_name !~ /spreadsheets.google.com/i
uri = Addressable::URI.parse(file_name)
download = Tempfile.new(uri.basename)
Net::HTTP.start(uri.host) do |http|
resp = http.get(uri.path)
open(download, "wb") do |file|
file.write(resp.body)
end
end
file_name = download
end
case file_name
when /^http.*spreadsheets\.google\.com/i
@original_file_type = "Google"
unless @dest
puts "Parsing Google spreadsheets requires a --destination directory."
exit
end
when /\.ods/i
@original_file_type = "Openoffice"
when /\.xlsx/i
@original_file_type = "Excelx"
when /\.xls/i
@original_file_type = "Excel"
else
puts "#{file_name} is not a supported type."
exit
end
s = Kernel.const_get(@original_file_type).new(file_name)
s.sheets.each do |spreadsheet_name|
s.default_sheet = spreadsheet_name
next unless s.first_row and s.first_column
csv_file_name = File.join(File::dirname(file_name).to_s,
File::basename(file_name).gsub(/\.(ods|xlsx?)/i, '') + "_" + spreadsheet_name.gsub(/[^[:alnum:]]/,'_') + '.csv')
FasterCSV.open(csv_file_name, "w", :force_quotes => true) do |csv|
s.first_row.upto(s.last_row) do |row_number|
row = []
s.first_column.upto(s.last_column) do |column_number|
val = s.cell(row_number, column_number).to_s
case s.celltype(row_number, column_number)
when :float
val.gsub!(/\.0$/, '')
when :date, :time, :datetime
val = s.cell(row_number, column_number).strftime("%Y-%m-%d %H:%M:%S")
end
row << val
end
csv << row
end
end
end
s.remove_tmp if s
File.unlink(file_name) if download
end
@rubiety
Copy link

rubiety commented Aug 13, 2010

Wrong.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment