2011-07-18 5 views
1

私は、Ruby 1.9でCSV :: Tableに行を追加しようとしています(質問はRuby 1.8のFasterCSVにも当てはまります)。新しい列の列の順序が表と異なる場合、ヘッダーが正しく指定されていても、要素は間違った列に追加されます。新しい行のヘッダーが無視されているかのように見えます。Ruby 1.9のCSV :: TableにCSV :: Rowを追加するときのヘッダーの意味は何ですか?

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 

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

答えて

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 
+0

あなたのパッチはうまくいきます。 Davidsの答えに私のコメントも見てください。 – Stefan

0

scuawn's answerで述べたように、CSV、あなたがそうであるように::表の#1 to_csv方法は動作しません。期待している。

ただし、CSV ::テーブルのデータは、の適切な列に配置されています。あなたの例に基づいて、それは本当であることが分かります:

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]] 
+0

ありがとうございました。しかし、私は今、CSV :: Tableは単に列の厳密な概念を持たないCSV :: Rowsのコレクションだと考えています。 values_at()を呼び出すと、列の順序が正しくなります。 table.by_col [0]を使用して最初の列を取得すると、[1,1]の代わりに[1,2]が得られます。 – Stefan

+0

#to_csvコードに欠陥があることや、ヘッダで順序付けられた行をすぐに格納できる#<<メソッドにも欠陥があることに同意します。 –

関連する問題