1

我有一个 .csv 文件,为简单起见,有两个字段:ID 和评论。id 的行是重复的,其中每个评论字段都满足了从它生成的任何表中的 max char 并且需要另一行。我现在需要将关联注释合并在一起,从而使用 Ruby 为每个唯一 ID 创建一行。

为了说明,我正在尝试使用 Ruby 来实现:

身份证 | 评论
1 | 片段 1
1 | 片段 2
2 | 片段 1
3 | 片段 1
3 | 片段 2
3 | 片段 3

进入这个:

身份证 | 评论
1 | 片段 1 片段 2
2 | 片段 1
3 | 片段 1 片段 2 片段 3

我已经接近找到一种使用inject({}) 和hashmap 的方法,但仍在努力正确合并所有数据。同时,我的代码似乎变得过于复杂,包含多个哈希和数组,只是为了对选择性行进行合并。

实现这种类型的行合并的最佳/最简单的方法是什么?可以只用数组来完成吗?

希望获得有关如何在 Ruby 中正常执行此操作的建议。

4

2 回答 2

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 但我认为使用标题字段名称更清楚。

于 2012-06-11T00:22:30.477 回答
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"}
于 2012-06-11T00:02:15.310 回答