From: Robert Klemme Date: 2011-04-28T23:03:04+09:00 Subject: Re: writing csv into file On Thu, Apr 28, 2011 at 3:04 PM, Alfred Pier wrote: > 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 : > > > >   >     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) 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 >  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 : Do you use output redirection for your script? >    [[]] > > ["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 !! Please do NOT shout. robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/