Ruby 1.9 CSV: выборочное игнорирование конверсий для столбца - PullRequest
3 голосов
/ 22 февраля 2012

У меня есть следующие данные CSV:

10,11,12.34

Я могу разобрать это, используя CSV из стандартной библиотеки, и преобразовать значения из строк в числа:

require 'csv'
CSV.parse( "10,11,12.34" )
=> [["10", "11", "12.34"]] 
CSV.parse( "10,11,12.34", {:converters => [:integer,:integer,:float]} )
=> [[10, 11, 12.34]]

Я не хочу преобразовать столбец 1, я просто хотел бы, чтобы это оставалось в виде строки. Я предположил, что могу опустить значение из массива преобразователей, но это не сработало:

CSV.parse( "10,11,12.34", {:converters => [nil,:integer,:float]} )
NoMethodError: undefined method `arity' for nil:NilClass
    from /home/ian/.rvm/rubies/jruby-1.6.6/lib/ruby/1.9/csv.rb:2188:in `convert_fields'
    from org/jruby/RubyArray.java:1614:in `each'
    from /home/ian/.rvm/rubies/jruby-1.6.6/lib/ruby/1.9/csv.rb:2187:in `convert_fields'
    from org/jruby/RubyArray.java:2332:in `collect'
    from org/jruby/RubyEnumerator.java:190:in `each'
    from org/jruby/RubyEnumerator.java:404:in `with_index'
    from /home/ian/.rvm/rubies/jruby-1.6.6/lib/ruby/1.9/csv.rb:2186:in `convert_fields'
    from /home/ian/.rvm/rubies/jruby-1.6.6/lib/ruby/1.9/csv.rb:1923:in `shift'
    from org/jruby/RubyKernel.java:1408:in `loop'
    from /home/ian/.rvm/rubies/jruby-1.6.6/lib/ruby/1.9/csv.rb:1825:in `shift'
    from /home/ian/.rvm/rubies/jruby-1.6.6/lib/ruby/1.9/csv.rb:1767:in `each'
    from org/jruby/RubyEnumerable.java:391:in `to_a'
    from /home/ian/.rvm/rubies/jruby-1.6.6/lib/ruby/1.9/csv.rb:1778:in `read'
    from /home/ian/.rvm/rubies/jruby-1.6.6/lib/ruby/1.9/csv.rb:1365:in `parse'
    from (irb):25:in `evaluate'

На самом деле мне не удалось найти какой-либо способ указать, что я бы хотел, чтобы первый столбец оставался не преобразованным. Есть предложения?


Обновление

Мне кажется, я неправильно понял намерение :converters. Это не отображение 1: 1 по столбцам, а список конвертеров, которые должны быть применены (я думаю) ко всем значениям. Я не уверен, документы не слишком ясны. Итак, более общий вопрос: как мне преобразовать некоторые столбцы в моем CSV, а не другие?

1 Ответ

1 голос
/ 22 февраля 2012

Документация говорит, что эти опции не указаны для столбца, а представляют собой список преобразователей, которые будут применены к всем столбцам.

Пример:

CSV.parse("10,11,13,12.34", { :converters => [lambda{|s|s.to_s + 'x'}] })
# => [["10x", "11x", "13x", "12.34x"]] 

Поскольку модуль CSV стремится конвертировать все, что может, вы можете также сдвинуть назад любые столбцы, которые вы хотите, используя .to_s или использовать опцию :unconverted_fields, чтобы сохранить исходные значения и разрешить доступ к ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...