Ruby smarter_csv头问题

时间:2015-02-20 17:28:40

标签: ruby-on-rails ruby csv smartercsv

我正在尝试创建一个提取数据的Ruby文件。我似乎遇到了一个问题,因为提供的CSV文件没有附加标题。所以,我试图告诉smarter_csv没有标题。我用的代码是:

transactions = SmarterCSV.process(file, {chunk_size: 20,remove_empty_values: false, remove_zero_values: false, headers_in_file: false, user_provided_headers:{timestamp: :timestamp, location: :loc, lat: :lat, long: :long, rfid: :rfid, start: :tart, ending: :end, type: :type , amount: :amount, status: :status}})

我也添加了一些新的标题,以便它们映射正确。不幸的是,结果是一个错误,即

  

/gems/smarter_csv-1.0.19/lib/smarter_csv/smarter_csv.rb:64:in process': undefined method地图!' for nil:NilClass(NoMethodError)

我认为传递“false”可能有问题,所以我将其更改为String,但不幸的是,因为没有添加自定义标题。我想知道是否有其他人正在努力解决CSV中的标题问题。也许有一个简单的解决方案,或者我们需要为创业板做出贡献。谢谢!

1 个答案:

答案 0 :(得分:3)

  

我也添加一些新的标题,以便它们映射正确。

user_provided_headers:{timestamp: :timestamp, location: :loc, lat: :lat, long: :long, rfid: :rfid, start: :tart, ending: :end, type: :type , amount: :amount, status: :status}

:user_provided_headers is supposed to be an Array不是哈希:

  

用户提供的标题字符串或符号数组,以定义
  应该使用哪些标头,覆盖任何文件内标头   您无法组合:user_provided_headers和:key_mapping   选项。

...

  

提供的CSV文件没有附加标题

如果csv文件没有标题,则以下内容没有意义:

location: :loc

:location会引用什么?这似乎是说文件中名为:location的标题应该在输出中被称为:locsmarter_csv有一个设置,用于将文件中的现有标头映射到输出中的新名称:

  

:key_mapping - 将CSV文件中的标题映射到键中的哈希值   结果哈希

但您声称您的csv文件没有标题,并且您还告诉smarter_csv您的文件没有标题:headers_in_file: false

以下是一些有关工作原理的示例:

csv.csv:

0,1,2
3,,5

还有一些代码:

require 'smarter_csv'

data = SmarterCSV.process(
  'csv.csv',
  {
    headers_in_file: false,
    user_provided_headers: %i[x y z],
    remove_empty_values: false,
    remove_zero_values: false,
  }
)

p data

--output:--
[{:x=>0, :y=>1, :z=>2}, {:x=>3, :y=>"", :z=>5}]

如果你告诉smarter_csv你的文件不包含headers_in_file: false的标题,那么你提供一个:key_mapping,告诉更智能的csv将文件中的标题映射到输出中的新名称,那么你会收到一个错误:

require 'smarter_csv'

data = SmarterCSV.process(
  'csv.csv',
  {
    headers_in_file: false,
    key_mapping: {'x' => 'x_val', 'y' => 'y_val', 'z' => 'z_val'},
    remove_empty_values: false,
    remove_zero_values: false,
  }
)

p data

--output:--
/Users/7stud/.rvm/gems/ruby-2.1.2/gems/smarter_csv-1.0.19/lib/smarter_csv/smarter_csv.rb:64:in `process': undefined method `map!' for nil:NilClass (NoMethodError)
    from 1.rb:3:in `<main>'

现在,如果您的csv文件实际上包含标题headers_in_file: true,那么提供:key_mapping选项是有道理的:

csv.csv:

x,y,z
0,1,2
3,,5

代码:

require 'smarter_csv'

data = SmarterCSV.process(
  'csv.csv',
  {
    headers_in_file: true,
    key_mapping: {x: 'x_val', y: 'y_val', z: 'z_val'},  #keys must be symbols
    remove_empty_values: false,
    remove_zero_values: false,
  }
)

p data

--output:--
[{:x_val=>0, :y_val=>1, :z_val=>2}, {:x_val=>3, :y_val=>"", :z_val=>5}]

根据您目前对smarter_csv的理解,我建议您重新考虑是否应该使用:chunk_size选项。如果您不知道,请不要。