我有一个.csv文件,为简单起见,它是两个字段:ID和注释。 id的行是重复的,其中每个注释字段已经从它生成的任何表中满足max char,并且另一行是必需的。我现在需要将关联注释合并在一起,从而使用Ruby为每个唯一ID创建一行。
为了说明,我正在尝试使用Ruby来实现这个目标:
ID | COMMENT
1 |片段1
1 |片段2
2 |片段1
3 |片段1
3 |片段2
3 |片段3
进入这个:
ID | COMMENT
1 |片段1片段2
2 |片段1
3 |片段1片段2片段3
我已经接近使用inject({})和hashmap找到一种方法来做到这一点,但仍然致力于正确合并所有数据。与此同时,似乎我的代码变得过于复杂,多个哈希和数组只是为了在选择行上进行合并。
实现此类行合并的最佳/最简单方法是什么?可以用数组完成吗?
非常感谢有关如何通常在Ruby中执行此操作的建议。
答案 0 :(得分:4)
保留标题并按ID使用组:
rows = CSV.read 'comment.csv', :headers => true
rows.group_by{|row| row['ID']}.values.each do |group|
puts [group.first['ID'], group.map{|r| r['COMMENT']} * ' '] * ' | '
end
您可以使用0和1,但我认为使用标题字段名称更清楚。
答案 1 :(得分:1)
使用以下csv文件,tmp.csv
1,fragment 11
1,fragment 21
2,fragment 21
2,fragment 22
3,fragment 31
3,fragment 32
3,fragment 33
试试这个(使用irb演示)
irb> require 'csv'
=> true
irb> h = Hash.new
=> {}
irb> CSV.foreach("tmp.csv") {|r| h[r[0]] = h.key?(r[0]) ? h[r[0]] + r[1] : r[1]}
=> nil
irb> h
=> {"1"=>"fragment 11fragment 21", "2"=>"fragment 21fragment 22", "3"=>"fragment 31fragment 32fragment 33"}