Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Ruby: Общие вопросы > Ruby CSV merge rows


Автор: arthur1981 31.8.2014, 22:28
Добрый день! Может кто знает как соединить ряды (rows) CSV файла на руби вот по такому принципу
Я ввожу CSV фаил с такой таблицей:
---url1---------|------url2-----  ---|---date visited-|------time visited---|----ip from-----|-links cliked 
myhome.com|--friendhome.com|---16/02/10---|-----------------------|-----------------|-------------- 
myhome.com|--friendhome.com|------------------|--------12.45-------|-192.168.1.1-|-------------- 
myhome.com|--friendhome.com|------------------|-----------------------|-----------------|-link1-------
someone.com|--bigimot.com---- |----13/10/14--|-----------------------|-----------------|--link2
someone.com|--bigimot.com-----|------------------|----11.15---------  -|--199.168.1.1|--------------

Вот что должно получится:

---url1----------|------url2-----------|-date visited--|------time visited---|----ip from-------|-links cliked 
--myhome.com|--friendhome.com|-16/02/10----|--------12.45--------|-192.168.1.1-- |--link1-------
--someone.com|--bigimot.com-----|-13/10/14----|--------11.15--------|--199.168.1.1-|--link2----

Тоесть код должен находить пару (url1 и url2) комбинация которых повторяется в таблице больше одного раза и по этой паре собрать информацию об этой паре в один ряд и удалить повторяющиеся ряды, информация по каждой паре (url1 и url2) уже уникальна просто разбросанна по разным рядам.
 
Вот мой код
Код

require 'csv'
 
def merge_csv_rows(orig_file, merged_file, keys)
  rows = Hash.new { |h, k| h[k] = Hash.new }
 
  CSV.open orig_file, 'r', headers: true, col_sep: ?;, :quote_char => "\x00" do |orig|
    orig.each do |row|
      key = row.values_at(*keys)
   values = row.to_hash.reject {|k,v| v.nil? }
   
    rows[key].merge!values.to_hash #do |_,old, new|
    end
    CSV.open merged_file, 'w', headers: orig.headers, write_headers: true do |merged|
      rows.each do |key, values|
        fields = orig.headers.map do |header|
          if  keys.include? header
            key[keys.index header]
          else
            values[header]
          end
        end
      puts fields
        merged << (CSV::Row.new orig.headers, fields)
      end
    end
  end

 
В моем варианте кода ошибка - получаю фаил с хидерами и с данными но тоже только один ряд, на пример если должно получится:
url1------------|------url2------------|---date visited----|------time visited---|----ip from-----|-links cliked 
myhome.com--|--friendhome.com--|---16/02/10-------|--------12.45------|-192.168.1.1-|--link1-------
someone.com--|--bigimot.com------|----13/10/14------|--------11.15-------|--199.168.1.1|--link2----

То я получаю только:
url1-----------|------url2-----------|---date visited|------time visited---|----ip from-----|-links cliked 
myhome.com|--friendhome.com|---16/02/10--|--------12.45-------|192.168.1.1-- |--link1-------
 
Кто может помогите пожалуйста!!!
Благодарю всех за помощь!!!


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)