Lining up delimiter separated text

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

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 Gray II

···

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.

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

···

On Jan 28, 2008, at 6:44 PM, 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.

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.

--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

···

--
Posted via http://www.ruby-forum.com/\.

7stud -- wrote:

···

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.

--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
--
Posted via http://www.ruby-forum.com/\.