2012-02-22 55 views
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中的某些列而不轉換其他列?

回答

1

documentation表示這些選項並未按每列指定,而是將應用於所有列的轉換器列表。

例子:

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

由於CSV模塊急於一切它可以轉換,你可能也移回你想使用.to_s任何列或使用:unconverted_fields選項來保存原始值,並允許訪問給他們。

+0

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