[ create a new paste ] login | about

Link: http://codepad.org/EMkUL4L1    [ raw code | output | fork ]

joshua_cheek - Ruby, pasted on Jan 12:
# a possible solution to http://www.ruby-forum.com/topic/201997

require 'rexml/document'
require 'rexml/formatters/pretty'

puts "Ruby version is #{RUBY_VERSION}" , String.new


xml_from = REXML::Document.new(DATA)                  # pull input from data at the end of this file
xml_to   = REXML::Document.new

# REXML::Element's hash values aren't consistent, so assign hash based on text
# and populate with array containing the column
columns  = Hash.new do |hash,column| 
  hash.fetch(column.text) { hash[column.text] = [column] }
end

# extract data from xml_from
xml_from.root.each_element do |row|
  columns[ row.elements[1] ] << row.elements[2]       # key is first column, value is array of all columns
end

# insert data into xml_to
xml_to.add_element 'rows'
columns.each do |first_column_text,columns|
  row = REXML::Element.new 'row'                      # gives us <row> ... </row>
  columns.each { |column| row.add_element(column) }   # places the columsn into the row
  xml_to.root.add_element row
end

# weird and hacky, but can't figure out how else to get this to output for humans
REXML::Formatters::Pretty.new.send 'write_document' , xml_to , STDOUT

__END__
<rows>
  <row>
    <column>Business Strategy</column>
    <column>bus1</column>
  </row>
  <row>
    <column>Company Description</column>
    <column>tar1</column>
  </row>
  <row>
    <column>Business Strategy</column>
    <column>bus2</column>
  </row>
  <row>
    <column>Company Description</column>
    <column>tar2</column>
  </row>
  <row>
    <column>Business Strategy</column>
    <column>bus3</column>
  </row>
  <row>
    <column>Company Description</column>
    <column>tar3</column>
  </row>
</rows>


Output:
Ruby version is 1.8.6

<rows>
  <row>
    <column>
      Company Description
    </column>
    <column>
      tar1
    </column>
    <column>
      tar2
    </column>
    <column>
      tar3
    </column>
  </row>
  <row>
    <column>
      Business Strategy
    </column>
    <column>
      bus1
    </column>
    <column>
      bus2
    </column>
    <column>
      bus3
    </column>
  </row>
</rows>


Create a new paste based on this one


Comments: