通过id ruby​​合并行csv

时间:2012-06-10 23:28:32

标签: ruby hashmap inject fastercsv

我有一个.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中执行此操作的建议。

2 个答案:

答案 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"}