Хранение в файле CSV - разделитель ruby - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь сохранить результаты моего упражнения в файл CSV.

Текущий файл CSV дает мне следующий вывод:

Name of Movie 1

Rating 1

Name of Movie 2 

Rating 2     

Я хотел бы получить следующий вывод:

Name of Movie 1 Rating 1 

Name of Movie 2 Rating 2 

Вот мой код, я полагаюон имеет дело с разделителем строк / столбцов:

require 'open-uri'
require 'nokogiri'
require 'csv'

array = []


for i in 1..10
  url = "http://www.allocine.fr/film/meilleurs//?page=#{i}"
  html_file = open(url).read
  html_doc = Nokogiri::HTML(html_file)


  html_doc.search('.img_side_content').each do |element|
    array << element.search('.no_underline').inner_text
    element.search('.note').each do |data|
      array << data.inner_text
    end
  end
end

puts array


csv_options = { row_sep: ',', force_quotes: true, quote_char: '"' }
filepath    = 'allocine.csv'

CSV.open(filepath, 'wb', csv_options) do |csv|
  array.each { |item| csv << [item] }
end

1 Ответ

0 голосов
/ 23 мая 2018

Я думаю, что проблема в том, что вы неправильно помещаете элементы в переменную array.По сути, ваш массив выглядит так:

['Movie 1 Title', 'Movie 1 rating', 'Movie 2 Title', 'Movie 2 rating', ...]

Что вам действительно нужно, так это массив массивов, например:

[
  ['Movie 1 Title', 'Movie 1 rating'],
  ['Movie 2 Title', 'Movie 2 rating'],
  ...
]

И как только ваш массив будет правильно установлен, выдаже не нужно указывать разделитель строк в опциях CSV.

Следующее должно сделать трюк:

require 'open-uri'
require 'nokogiri'
require 'csv'

array = []


10.times do |i|
  url = "http://www.allocine.fr/film/meilleurs//?page=#{i}"
  html_file = open(url).read
  html_doc = Nokogiri::HTML(html_file)


  html_doc.search('.img_side_content').each do |element|
    title = element.search('.no_underline').inner_text.strip
    notes = element.search('.note').map { |note| note.inner_text }
    array << [title, notes].flatten
  end
end

puts array

filepath    = 'allocine.csv'
csv_options = { force_quotes: true, quote_char: '"' }

CSV.open(filepath, 'w', csv_options) do |csv|
  array.each do |item|
    csv << item
  end
end

(я также позволил себе сменить цикл for на times, который более похож на рубин;))

...