From: James Gray Date: 2008-01-29T03:14:07+09:00 Subject: Re: lining up delimiter separated text On Jan 28, 2008, at 11:44 AM, scooterm@hotmail.com wrote: > BEFORE: > fname ;; lname ;; age ;; sex ;; > homer ;; simpson ;; 33 ;; male > maggie;; simpson ;; 03 ;; female > bart;;simpson;;10;;male > > AFTER: > fname ;; lname ;; age ;; sex > homer ;; simpson ;; 33 ;; male > maggie ;; simpson ;; 03 ;; female > bart ;; simpson ;; 10 ;; male > > REQUEST: > Show a really cool way to change before into after with > ruby. Cool = fewest lines OR just plain clever. This doesn't perfectly match your output, but it gets close: #!/usr/bin/env ruby -wKU def pretty_print(input, sep = ';;') data = input.map { |line| line.chomp.split(/ \s*#{Regexp.escape(sep)}\s*/) } sizes = (0...data.first.size).map { |i| data.map { |row| row[i].size }.max } data.inject("") do |output, row| output + (0...row.size).map { |i| "%-#{sizes[i]}s" % row[i] }.join(" #{sep} ") + "\n" end end puts pretty_print(<> fname ;; lname ;; age ;; sex # >> homer ;; simpson ;; 33 ;; male # >> maggie ;; simpson ;; 03 ;; female # >> bart ;; simpson ;; 10 ;; male __END__ James Edward Gray II