将多个数据文件合并为一个输出,然后从此

时间:2015-10-12 10:44:43

标签: ruby json csv ruby-on-rails-4 hash

上午,

我正在尝试在rails中创建一个函数来合并3个文件, 我有2个CSV文件和1个JSON文件,这些文件都与书籍有关, 3个文件具有相同书籍的不同数据部分, 因此,一个CSV具有标题和ID,另一个具有相同ID和DOI的不同标题.JSON文件具有作者名称作为键的散列,并且值是书籍的所有DOI的数组。

示例数据:

CSV One:

DOI,Title,ID
1111,Ruby on Rails,1234-1234
2222,Rails 4.0,4321-4321

CSV二:

Title,ID
Ruby,1234-1234
Rails,4321-4321

JSON:

[{"name":"Homer Simpson","articles":["1111","2222"]}]

示例输出(作为JSON),

    [{
    "doi": "1111",
    "title": "Ruby on Rails",
    "author": "Homer Simpson",
    "book": "Ruby",
    "ID": "1234-1234"
    }
    {
    "doi": "2222",
    "title": "Rails 4.0",
    "author": "Homer Simpson",
    "book": "Rails",
    "ID": "4321-4321"
    }]

我知道我需要最初解析数据,将CSV转换为数组然后遍历它们,我正在努力解决的问题是合并为单个哈希值。

1 个答案:

答案 0 :(得分:1)

require 'csv'
require 'json'

csv1 = CSV.open('csv1.csv').read
csv2 = CSV.open('csv2.csv').read
csv1.shift
csv2.shift
@json = JSON.parse('[{"name":"Homer Simpson","articles":["1111","2222"]}]')

@csv1_data = csv1.inject([]) do |res, el|
  res << { doi: el[0], title: el[1], id: el[2] }
  res
end

@csv2_data = csv2.inject([]) do |res, el|
  res << { book: el[0], id: el[1] }
  res
end

def book_attributes(id)
  @csv2_data.find { |el| el[:id] == id }
end

def author_attributes(doi)
  item = @json.find { |el| el['articles'].include? doi }
  { author: item['name'] }
end


result = @csv1_data.inject([]) do |res, el|
  details = el.merge(author_attributes(el[:doi]))
  details.merge!(book_attributes(el[:id]))
  res << details
  res
end

puts result

希望这样做。