在Ruby 1.9中将​​CSV :: Row添加到CSV :: Table时,标题的含义是什么?

时间:2011-07-18 14:49:11

标签: ruby csv fastercsv

我正在尝试向Ruby 1.9中的CSV :: Table添加一行(这些问题也适用于Ruby 1.8中的FasterCSV)。如果新行中的列顺序与表中的列顺序不同,则即使正确指定了标题,元素也会添加到错误的列中。看起来好像忽略了新行中的标题。

require 'csv'

first_row = CSV::Row.new(["h1","h2","h3"],[1,2,3])
second_row = CSV::Row.new(["h2","h1","h3"],[2,1,3]) # note the change in order
table = CSV::Table.new([first_row])
table << second_row
puts table.to_s

输出:

h1,h2,h3
1,2,3
2,1,3

但是由于我明确指定了标头,我希望CSV能够将新行的标题与表格的标题相匹配并生成此输出:

h1,h2,h3
1,2,3
1,2,3

有任何解释吗?除了在创建新行之前自行重新排序列之外,我可以对此做些什么吗?

2 个答案:

答案 0 :(得分:0)

源代码CSV :: Table#to_csv。

中的解释

我是Ruby的新手,但试试我的补丁:

--- csv.rb.old  2011-07-18 23:24:38.184913108 +0600
+++ csv.rb  2011-07-18 23:23:54.972802099 +0600
@@ -836,7 +836,7 @@
         if row.header_row?
           rows
         else
-            rows + [row.fields.to_csv(options)]
+            rows + [row.fields(*headers).to_csv(options)]
         end
       end.join
     end

输出:

h1,h2,h3
1,2,3
1,2,3

答案 1 :(得分:0)

scuawn's answer中所述,CSV :: Table#to_csv方法无法正常工作。

然而,CSV :: Table 中的数据放在正确的列中!根据您的示例,您可能会看到这是真的:

irb(main):1:0> table.entries
=> [#<CSV::Row "h1":1 "h2":2 "h3":3>, #<CSV::Row "h2":2 "h1":1 "h3":3>]
irb(main):2:0> table.headers
=> ["h1", "h2", "h3"]
irb(main):3:0> table.values_at(*table.headers)
=> [[1, 2, 3], [1, 2, 3]]