Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env ruby
- # Parse a CSV file with column names.
- # The first line of the file is assumed
- # to be the column names, and also defines
- # the number of columns. Returns an
- # array of hashes.
- def csv(file)
- File.open(file) do|f|
- columns = f.readline.chomp.split(',')
- table = []
- until f.eof?
- row = f.readline.chomp.split(',')
- row = columns.zip(row).flatten
- table << Hash[*row]
- end
- return columns, table
- end
- end
- # Print a grade book from a CSV file.
- # A grade book is alphabetized by first
- # and last name and the columns are
- # aligned properly.
- columns, grades = csv(ARGV[0])
- # Sort names by last name, then first name
- grades.sort! do|a,b|
- a['Name'].split(' ').reverse.join(' ') <=> b['Name'].split(' ').reverse.join(' ')
- end
- # Determine column widths
- column_widths = {}
- columns.each do|c|
- column_widths[c] = [ c.length, *grades.map{|g| g[c].length } ].max
- end
- # Make the format string
- format = columns.map{|c| "%-#{column_widths[c]}s" }.join(' | ')
- # Print the table
- puts format % columns
- puts format.tr(' |', '-+') % column_widths.values.map{|v| '-'*v }
- grades.each do|g|
- puts format % columns.map{|c| g[c] }
- end
Add Comment
Please, Sign In to add comment