2013-12-10 4 views
0

У меня есть программа, использующая драгоценный камень электронной таблицы для создания CSV-файла; Я не смог найти способ настройки необходимых мне функций.Как настроить gem/output таблицы электронной таблицы?

Это то, что я хотел бы сделать: номер модели и поле additional_image должно быть «синхронно», то есть каждое дополнительное изображение, записанное в документ электронной таблицы, должно быть новой строкой и не должно быть обернуто.

Ниже приведены некоторые фрагменты желаемого результата в отличие от тока. Эти поля определяются объектами XPath, которые скрипируют экран с использованием другого драгоценного камня. Программа не будет знать наверняка, сколько объектов она встретит в дополнительном поле изображения, но из-за бизнес-логики число объектов в дополнительном поле изображения должно отражать количество объектов номера модели, которые записаны в электронную таблицу.

model 
168868837a 
168868837a 
168868837a 
168868837a 
168868837a 
168868837a 

additional_image 
1688688371.jpg 
1688688372.jpg 
1688688373.jpg 
1688688374.jpg 
1688688375.jpg 
1688688376.jpg 

Это текущий код:

require "capybara/dsl" 
require "spreadsheet" 
require "fileutils" 
require "open-uri" 

LOCAL_DIR = 'data-hold/images' 

FileUtils.makedirs(LOCAL_DIR) unless File.exists?LOCAL_DIR 
Capybara.run_server = false 
Capybara.default_driver = :selenium 
Capybara.default_selector = :xpath 
Spreadsheet.client_encoding = 'UTF-8' 

class Tomtop 
    include Capybara::DSL 

    def initialize 
    @excel = Spreadsheet::Workbook.new 
    @work_list = @excel.create_worksheet 
    @row = 0 
    end 

    def go 
    visit_main_link 
    end 

    def retryable(options = {}, &block) 
     opts = { :tries => 1, :on => Exception }.merge(options) 

     retry_exception, retries = opts[:on], opts[:tries] 

     begin 
     return yield 
     rescue retry_exception 
     retry if (retries -= 1) > 0 
     end 

     yield 
    end 

    def visit_main_link 
    retryable(:tries => 1, :on => OpenURI::HTTPError) do 
    visit "http://www.example.com/clothing-accessories?dir=asc&limit=72&order=position" 
    results = all("//h5/a[contains(@onclick, 'analyticsLog')]") 
    item = [] 

    results.each do |a| 
     item << a[:href] 
    end 
    item.each do |link| 
      visit link 
      save_item 
     end 
    @excel.write "inventory.csv" 
    end 

    end 

    def save_item 
     data = all("//*[@id='content-wrapper']/div[2]/div/div") 
     data.each do |info| 
     @work_list[@row, 0] = info.find("//*[@id='productright']/div/div[1]/h1").text 
     price = info.first("//div[contains(@class, 'price font left')]") 
     @work_list[@row, 1] = (price.text.to_f * 1.33).round(2) if price 
     @work_list[@row, 2] = info.find("//*[@id='productright']/div/div[11]").text 
     @work_list[@row, 3] = info.find("//*[@id='tabcontent1']/div/div").text.strip 
     color = info.all("//dd[1]//select[contains(@name, 'options')]//*[@price='0']") 
     @work_list[@row, 4] = color.collect(&:text).join(', ') 
     size = info.all("//dd[2]//select[contains(@name, 'options')]//*[@price='0']") 
     @work_list[@row, 5] = size.collect(&:text).join(', ') 
     model = File.basename(info.find("//*[@id='content-wrapper']/div[2]/div/div/div[1]/div[1]/a")['href']) 
     @work_list[@row, 6] = model.gsub!(/\D/, "") 
     @work_list[@row, 7] = File.basename(info.find("//*[@id='content-wrapper']/div[2]/div/div/div[1]/div[1]/a")['href']) 
     additional_image = info.all("//*[@rel='lightbox[rotation]']") 
     @work_list[@row, 8] = additional_image.map { |link| File.basename(link['href']) }.join(', ') 
     images = imagelink.map { |link| link['href'] } 
     images.each do |image| 
      File.open(File.basename("#{LOCAL_DIR}/#{image}"), 'w') do |f| 
      f.write(open(image).read) 
     end 

     end 
     @row = @row + 1 
    end 

    end 

end 


tomtop = Tomtop.new 
tomtop.go 

Я хотел бы, чтобы это сделать две вещи, которые я не знаю, как это сделать:

  1. Каждое дополнительное изображение должно напечатать на новая строка (в настоящее время она печатает все в одной ячейке).
  2. Я хотел бы, чтобы поле модели дублировалось ровно столько раз, сколько есть additional_images в той же новой линии.

ответ

1

Используйте драгоценный камень CSV. Я долгое время писал это, чтобы вы могли видеть, как это работает.

require 'csv' 

DOC = "file.csv" 
profile = [] 
profile[0] = "model" 

CSV.open(DOC, "a") do |me| 
me << profile 
end 


img_url = ['pic_1.jpg','pic_2.jpg','pic_3.jpg','pic_4.jpg','pic_5.jpg','pic_6.jpg'] 

a = 0 
b = img_url.length 
while a < b 
profile = [] 
profile[0] = img_url[a] 

CSV.open(DOC, "a") do |me| 
me << profile  
end 

a += 1 
end 

Файл CSV должен выглядеть следующим образом

model 
pic_1.jpg 
pic_2.jpg 
pic_3.jpg 
pic_4.jpg 
pic_5.jpg 
pic_6.jpg 

за последний вопрос

whatever = [] 
whatever = temp[1] + " " + temp[2] 
profile[x] = whatever 

ИЛИ

profile[x] = temp[1] + " " + temp[2] 

NIL ошибка в массиве

if temp[2] == nil 
profile[x] = temp[1] 
else 
profile[x] = temp[1] + " " + temp[2] 
end 
+0

Вы имеете в виду использование этого в сочетании с драгоценным камнем электронной таблицы или изменение всего создания csv на драгоценный камень csv. Полагаю, я понимаю, как работает цикл while, но как бы реализовать это в текущем коде. Спасибо за ваше время. – jcuwaz

+0

Вы можете распечатать свой массив данных? – Duck1337

+0

Duck мы можем вернуться к этому, я все еще работаю над этой прогой, и я не уверен, что вы поняли, что я хотел сделать. Вы, безусловно, один из экспертов, когда речь идет о драгоценности CSV, и я думаю, что это сэкономит мне много времени на создание других моделей, если я смогу настроить существующий выход csv для работы с сайтом. Вот ссылка на файл csv, который выводит моя текущая программа: https://drive.google.com/file/d/0B4VR1BUz6onVRnVfSURBTDZkMDA/edit?usp=sharing; Мне нужно манипулировать им таким образом, чтобы он соответствовал требованиям к загрузке программного обеспечения для электронной коммерции. – jcuwaz

Смежные вопросы