3
我具有以下CSV數據:紅寶石1.9 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中的某些列而不轉換其他列?
「轉換」方法的鏈接已經回答了我的問題,因爲從根本上說'CSV'的價值轉換方法並不是我想要的。我希望我的用戶能夠說「這是一列整數,浮點數等等」,而不是讓CSV機會性地轉換任何可能的東西。但是,如果我使用'convert'的雙參數形式,它將'field_info'結構與值一起傳遞,我可以保留自己的列轉換器索引。 – 2012-02-23 10:05:43