I also, add some new headers so they map right.
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 не Hash:
user provided Array of header strings or symbols, to define
what headers should be used, overriding any in-file headers.
You can not combine the :user_provided_headers and :key_mapping options.
...
the provided CSV files don't have headers attached
Если файл CSV не имеет заголовков, следующий не имеет смысла:
location: :loc
Что будет :location
обратитесь к? Это, кажется, говорит о том, что заголовок с именем :location
в файле должен быть вызван :loc
на выходе. smarter_csv
имеет настройки для отображения существующих заголовков в файл новых имен на выходе:
:key_mapping -- hash which maps headers from the CSV file to keys in the result hash
Но вы утверждаете ваш файл 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
. Если вы не знаете, не делайте этого.
спасибо, это было очень полезно! Я ценю ваш быстрый ответ. Мой вопрос действительно заключался в HASH вместо массива. На самом деле не бодрствовал с этим, но хорошо понять, что вам нужно сделать Array без заголовков и Hash с заголовками ... – user2164689
yes, Массив должен быть предоставлен с помощью опции user_defined_headers – Tilo