我正在尝试创建一个提取数据的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中的标题问题。也许有一个简单的解决方案,或者我们需要为创业板做出贡献。谢谢!
答案 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
的标题应该在输出中被称为:loc
。 smarter_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
选项。如果您不知道,请不要。