[#50363] [質問] Ruby socket.send でUDP Packet が出ない? ネットワーク環境によるものか? — <yamataka@...08.itscom.net>

山口と申します。

9 messages 2016/07/27

[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

In This Thread

Prev Next