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.
–thanks
On Jan 28, 2008, at 11:44 AM, [email protected] wrote:
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(<<END_BEFORE)
fname ;; lname ;; age ;; sex ;;
homer ;; simpson ;; 33 ;; male
maggie;; simpson ;; 03 ;; female
bart;;simpson;;10;;male
END_BEFORE
>> fname ;; lname ;; age ;; sex
>> homer ;; simpson ;; 33 ;; male
>> maggie ;; simpson ;; 03 ;; female
>> bart ;; simpson ;; 10 ;; male
END
James Edward G. II
On Jan 28, 2008, at 6:44 PM, [email protected] wrote:
bart ;; simpson ;; 10 ;; male
REQUEST:
Show a really cool way to change before into after with
ruby. Cool = fewest lines OR just plain clever.
Modulus whitespace, here’s a solution
records = DATA.readlines.map {|line| line.chomp.split(/\s*;;\s*/)}
max_widths = records.transpose.map {|col| col.map {|cell|
cell.length}.max}
records.each do |r|
format = max_widths[0…r.size].map {|mw| “%-#{mw}s”}.join(" ;; ")
puts format % r
end
END
fname ;; lname ;; age ;; sex ;;
homer ;; simpson ;; 33 ;; male
maggie;; simpson ;; 03 ;; female
bart;;simpson;;10;;male
7stud – wrote:
[email protected] 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.
–thanks
How about:
str =<<STR
fname ;; lname ;; age ;; sex ;;
homer ;; simpson ;; 33 ;; male
maggie;; simpson ;; 03 ;; female
bart;;simpson;;10;;male
STR
str.each("\n") do |line|
puts “%-8s%-4s%-8s%-4s%-4s%-4s%-8s” % line.split(/(;;)/).map {|elmt|
elmt.strip}
end
Or, this might be a little better:
str.each("\n") do |line|
puts “%-8s%-4s%-8s%-4s%-4s%-4s%-8s” % line.chomp.split(/\s*(;;)\s*/)
end
[email protected] 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.
–thanks
How about:
str =<<STR
fname ;; lname ;; age ;; sex ;;
homer ;; simpson ;; 33 ;; male
maggie;; simpson ;; 03 ;; female
bart;;simpson;;10;;male
STR
str.each("\n") do |line|
puts “%-8s%-4s%-8s%-4s%-4s%-4s%-8s” % line.split(/(;;)/).map {|elmt|
elmt.strip}
end
–output:–
fname ;; lname ;; age ;; sex
homer ;; simpson ;; 33 ;; male
maggie ;; simpson ;; 03 ;; female
bart ;; simpson ;; 10 ;; male