上午,
我正在尝试在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转换为数组然后遍历它们,我正在努力解决的问题是合并为单个哈希值。
答案 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
希望这样做。