Convert xml to csv in ruby and write it to a text file

Hello guys ! I’m new in Ruby…Hope you can help because i’m trying a
lot and just can’t see where is the problem…
I have this xml, and not only this, i want just for any xml file that i
might put :

<?xml version="1.0"?> p1 Skoda 10000 4 Czech Republic p2 Mercedes 50000 5 Germany p3 Alfa Romeo 18000 19 Italy p4 Fiat 1500 15000 Italy

AND USING THE CODE BELOW:

require ‘nokogiri’
require ‘pp’

xmldoc = Nokogiri::XML(IO.read(“xmlinputfile.xml”))
columns = xmldoc.xpath(’//[position()=1]/*’).map(&:name)

print “give csv output file\n”
csvoutputfile = gets.chomp
File.open(csvoutputfile, ‘w’) do |f|
rows =[]
xmldoc.xpath(’//’).each do |row_xml|
row_values = []
f.puts " #{rows << row_values}"
row_xml.xpath(’./*’).each do |field|
f.puts “#{row_values << field.text}”

      end

end
pp rows

end

I WANT TO CONVERT IT TO CSV FORMAT LIKE THIS:

id,name,price,stock,country
p1,Skoda,10000,4,Czech Republic,
p2,Mercedes,50000,5,Germany,
.
.
.
. and so on

THE RUBY CODE OF CONVERTION WORKS FINE BUT ONLY WHEN I RUN IT IN THE
COMMAND PROMT, ONLY THERE IS SHOWS THE CSV FORMAT RIGHT

BUT I WANT TO WRITE IT IN A TXT FILE AND THIS IS WHAT I GET WHEN I TRY
WRITING IT INTO A txt :

[[]]

[“p1”]
[“p1”, “Skoda”]
[“p1”, “Skoda”, “10000”]
[“p1”, “Skoda”, “10000”, “4”]
[“p1”, “Skoda”, “10000”, “4”, “Czech Republic”]
[[“p1”, “Skoda”, “10000”, “4”, “Czech Republic”], []]
[“p2”]
[“p2”, “Mercedes”]
[“p2”, “Mercedes”, “50000”]
[“p2”, “Mercedes”, “50000”, “5”]
[“p2”, “Mercedes”, “50000”, “5”, “Germany”]

[[“p1”, “Skoda”, “10000”, “4”, “Czech Republic”], [“p2”, “Mercedes”,
“50000”, “5”, “Germany”], []]
[“p3”]
[“p3”, “Alfa Romeo”]
[“p3”, “Alfa Romeo”, “18000”]
[“p3”, “Alfa Romeo”, “18000”, “19”]
[“p3”, “Alfa Romeo”, “18000”, “19”, “Italy”]
[[“p1”, “Skoda”, “10000”, “4”, “Czech Republic”], [“p2”, “Mercedes”,
“50000”, “5”, “Germany”],
[“p3”, “Alfa Romeo”, “18000”, “19”, “Italy”],[]]

PLEASE CAN ANYBODY SHOW ME MY MISTAKE AND WHAT SHOULD I DO BECAUSE I
CANNOT FIND IT… AND I
DON’T UNDERSTAND THE REASON THAT IT SHOWS IT LIKE THIS IN THE txt FILE.

THANK YOU IN ADVANCE !!

On Thu, Apr 28, 2011 at 3:04 PM, Alfred Pier
[email protected] wrote:

10000

15000
xmldoc = Nokogiri::XML(IO.read(“xmlinputfile.xml”))
columns = xmldoc.xpath(’//[position()=1]/*’).map(&:name)

IMHO this is sufficient as XPath: ‘//[1]/*’

print “give csv output file\n”
csvoutputfile = gets.chomp
File.open(csvoutputfile, ‘w’) do |f|
rows =[]
xmldoc.xpath(’//’).each do |row_xml|
row_values = []
f.puts " #{rows << row_values}"

You should separate filling your data structure from doing CSV output
above. Right now you are printing rows for every record!

row_xml.xpath('./*').each do |field|
   f.puts "#{row_values << field.text}"

Again, you should separate filling your data structure from doing CSV
output above (or completely get rid of “rows”) e.g.

puts row_xml.xpath(’./*’).map(&:text).join

end

end
pp rows

You are seeing output of that last line.

end

I would also consider using CSV for writing because that will give you
proper quoting

CSV.open(“foo.txt”, “w”, col_sep:",") do |csv|

csv << row_xml.xpath(’./*’).map(&:text)

end

THE RUBY CODE OF CONVERTION WORKS FINE BUT ONLY WHEN I RUN IT IN THE
COMMAND PROMT, ONLY THERE IS SHOWS THE CSV FORMAT RIGHT

BUT I WANT TO WRITE IT IN A TXT FILE AND THIS IS WHAT I GET WHEN I TRY
WRITING IT INTO A txt :

Do you use output redirection for your script?

[“p2”, “Mercedes”, “50000”]
[[“p1”, “Skoda”, “10000”, “4”, “Czech Republic”], [“p2”, “Mercedes”,
“50000”, “5”, “Germany”],
[“p3”, “Alfa Romeo”, “18000”, “19”, “Italy”],[]]

PLEASE CAN ANYBODY SHOW ME MY MISTAKE AND WHAT SHOULD I DO BECAUSE I
CANNOT FIND IT… AND I
DON’T UNDERSTAND THE REASON THAT IT SHOWS IT LIKE THIS IN THE txt FILE.

THANK YOU IN ADVANCE !!

Please do NOT shout.

robert

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs