Writing csv into 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"?>
<records>
   <company>
     <id>p1</id>
     <name>Skoda</name>
     <price>10000</price>
     <stock>4</stock>
     <country>Czech Republic</country>
  </company>
  <company>
     <id>p2</id>
     <name>Mercedes</name>
     <price>50000</price>
     <stock>5</stock>
     <country>Germany</country>
  </company>
  <company>
     <id>p3</id>
     <name>Alfa Romeo</name>
     <price>18000</price>
     <stock>19</stock>
     <country>Italy</country>
  </company>
  <company>
     <id>p4</id>
     <name>Fiat</name>
     <price>1500</price>
     <stock>15000</stock>
     <country>Italy</country>
  </company>
</records>

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

···

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

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"?>
<records>
<company>
<id>p1</id>
<name>Skoda</name>
<price>10000</price>
<stock>4</stock>
<country>Czech Republic</country>
</company>
<company>
<id>p2</id>
<name>Mercedes</name>
<price>50000</price>
<stock>5</stock>
<country>Germany</country>
</company>
<company>
<id>p3</id>
<name>Alfa Romeo</name>
<price>18000</price>
<stock>19</stock>
<country>Italy</country>
</company>
<company>
<id>p4</id>
<name>Fiat</name>
<price>1500</price>
<stock>15000</stock>
<country>Italy</country>
</company>
</records>

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\(&#39;\./\*&#39;\)\.each do |field|
           f\.puts &quot;\#\{row\_values &lt;&lt; field\.text\}&quot;

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

···

On Thu, Apr 28, 2011 at 3:04 PM, Alfred Pier <marineforlifecobra@yahoo.gr> wrote:

--
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/