[ruby-list:50361] Re: CSV のコンバーターが nil に対して効かない
From:
"5.5" <5.5@...>
Date:
2016-07-26 02:57:31 UTC
List:
ruby-list #50361
5.5 です。ありがとうございます。
何が起こったのかが大変よくわかりました。
↓ここ(下から2番目)
http://d.hatena.ne.jp/nagachika/20140401/ruby_trunk_changes_45487_45498
に解説がありました。
標準添付ライブラリ csv で header を取得する時に :header_converters
オプションで header の内容を変更する時に空の要素は処理をスキップして
NoMethodError などが発生しないようにしています。
また「Don't attempt to convert nil headers. 」という文言からしても,
本来はヘッダーだけに適用する変更のはずだったぽい(?)ですね。
このプルリクエストから始まった(?)ようです。
https://github.com/ruby/ruby/pull/575
空フィールドをコンバーターで空文字列にする手段が失われました。
現状だと CSV ファイルを開くのに
CSV.open(csv_path, headers: true).each do |row|
row.each do |field_name, value|
row[field_name] = value.to_s
end
# なんとかかんとか(やりたいこと)
end
とかってカンジでしょうか。んーむ。
On 2016/07/26 9:12, okkez wrote:
> okkez です。
>
> 変わったのは↓のコミットみたいですね。
>
> https://github.com/ruby/ruby/commit/7c4d4e1eb2897cec295ea9316835fc3cfef96d6d
>
> どこかでレポートされて直したらしいですが、どこでレポートされたのかまではわかりませんでした。
>
>
>
> 2016年7月25日 21:52 5.5 <5.5@moji.gr.jp>:
>> 5.5 です。
>>
>> CSV のコンバーターの仕様が Ruby 2.1 → 2.2 で変わったんで
>> しょうか?
>>
>> ダブルクオートで囲まれてない空フィールドを nil じゃなくて
>> 空文字列にするため,いままで
>>
>> ->(s){s.to_s}
>>
>> というコンバーターを使ってきました。
>> ところが,Ruby 2.2, 2.3, では,そもそも nil に対しては
>> コンバーターが働かないようで,nil のままになります。
>>
>> 再現コードは以下の通りです。
>>
>> require "csv"
>>
>> CSV.new(",foo", converters: ->(s){s.to_s}).each do |row|
>> p row
>> end
>>
>> これで,
>>
>> ruby 2.1.7p400 (2015-08-18 revision 51632) [i386-mingw32]
>>
>> だと
>>
>> ["", "foo"]
>>
>> になりますが,
>>
>> ruby 2.2.5p319 (2016-04-26 revision 54774) [i386-mingw32]
>>
>> だと
>>
>> [nil, "foo"]
>>
>> になっちゃいます。
>>
>> 公式リファンレスマニュアルを見ても,とくにこのあたりの仕様
>> 変更についての記述が見当たりませんでした。
>> Ruby 2.2.0 のリリースノート
>> https://www.ruby-lang.org/ja/news/2014/12/25/ruby-2-2-0-released/
>> や NEWS
>> https://github.com/ruby/ruby/blob/v2_2_0/NEWS
>> にも「CSV」の文字が見当たりませんでした。
>>
>> --
>> 5.5@moji.gr.jp
>
>
>
--
5.5@moji.gr.jp