2015-02-20 2 views
0

Я пытаюсь создать файл Ruby, который извлекает данные. Кажется, я столкнулся с проблемой, поскольку предоставленные CSV-файлы не имеют прикрепленных заголовков. Итак, я пытаюсь сказать smarter_csv, что нет заголовков. Код, я использую для этого:Проблемы с заголовком Ruby 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 map!' for nil:NilClass (NoMethodError)

Я думал, что может быть что-то не так с принятием «ложной», поэтому я изменил его в строку, но это привело, к сожалению, в том, что не было никаких пользовательских заголовков добавлено. Мне было интересно, если кто-то еще борется с заголовками CSV. Может быть, есть простое решение, или, может быть, нам нужно внести свой вклад в GEM. Благодаря!

ответ

2

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_headersis 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. Если вы не знаете, не делайте этого.

+0

спасибо, это было очень полезно! Я ценю ваш быстрый ответ. Мой вопрос действительно заключался в HASH вместо массива. На самом деле не бодрствовал с этим, но хорошо понять, что вам нужно сделать Array без заголовков и Hash с заголовками ... – user2164689

+0

yes, Массив должен быть предоставлен с помощью опции user_defined_headers – Tilo

Смежные вопросы