1

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

説明はありますか?新しい行を作成する前に自分で列を並べ替える以外に何かできることはありますか?

4

2 に答える 2

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
于 2011-07-18T17:28:32.480 に答える
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]]
于 2011-07-18T22:14:01.710 に答える