Project

General

Profile

Bug #14482

headerが重複したCSVをheaders:trueでparseした場合、row.to_h[key] と row[key] の結果が一致しない

Added by tompng (tomoya ishida) over 1 year ago. Updated over 1 year ago.

Status:
Closed
Priority:
Normal
Target version:
-
ruby -v:
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin16]
[ruby-dev:50475]

Description

1行目に重複したkeyがあるcsvファイルをheaders: trueでparseした場合、
row[key]とrow.to_h[key]が異なる値を返します。

require 'csv'
invalid_header_csv = "id,name,name\n1,ichiro,ICHIRO\n2,jack,JACK"
rows = CSV.parse invalid_header_csv, headers: true
puts rows[0]['name'] #=> ichiro
puts rows[0].to_h['name'] #=> ICHIRO

ドキュメントには

to_hash -> Hash
自身をシンプルなハッシュに変換します。
フィールドの順序は無視されます。 重複したフィールドは削除されます。

とありますが、削除されるフィールドとrow[key]で無視されるフィールドは一致している方が良いのではないかと思います。

class CSV::Row
  def to_h
    headers.uniq.map { |key| [key, self[key]] }.to_h
  end
  alias_method :to_hash, :to_h
end

History

Updated by kou (Kouhei Sutou) over 1 year ago

  • Assignee set to kou (Kouhei Sutou)
  • Status changed from Open to Closed

後方互換性がなくなってしまうのでどうするかなぁと考えてみたんですが、もともと重複していた場合はなにを返すかわからない、という仕様だったので変わっても大丈夫かなぁと言う気持ちになったので、同じになるようにしました。

Also available in: Atom PDF