Я пытаюсь импортировать файл с tsv (tab разделенными данными) в мою базу данных, только он не отформатирован должным образом. Столбцы price
и count
разделены только пробелом (за исключением строки заголовка), и значения оба помещаются в ключ price
, перемещая все данные в неправильные пары значений ключа.Rails нормализует данные CSV-файла
TSV файл:
purchaser name item description price count merchant address merchant name
Alice Bob $10 off $20 of food 10.0 2 987 Fake St Bob's Pizza
Example Name $30 of awesome for $10 10.0 5 456 Unreal Rd Tom's Awesome Shop
Name Three $20 Sneakers for $5 5.0 1 123 Fake St Sneaker Store Emporium
John Williams $20 Sneakers for $5 5.0 4 123 Fake St Sneaker Store Emporium
в /models/purchase.rb
:
class Purchase < ActiveRecord::Base
# validates :item_price, :numericality => { :greater_than_or_equal_to => 0 }
def self.import(file)
CSV.foreach(file.path, :headers => true,
:header_converters => lambda { |h| h.downcase.gsub(' ', '_')},
:col_sep => "\t"
) do |row|
# debugger
purchase_hash = row.to_hash
Purchase.create!(purchase_hash)
end
end
end
Если я импортировать файл и комментарий в отладчике в модели, а затем введите row
возвращается:
#<CSV::Row "purchaser_name":"Alice Bob" "item_description":"$10 off $20 of food" "price":"10.0 2" "count":" 987 Fake St" "merchant_address":" Bob's Pizza" "merchant_name":nil>
row.inspect
возвращается:
"#<CSV::Row \"purchaser_name\":\"Alice Bob\" \"item_description\":\"$10 off $20 of food\" \"price\":\"10.0 2\" \"count\":\" 987 Fake St\" \"merchant_address\":\" Bob's Pizza\" \"merchant_name\":nil>"
Как вы можете видеть price
(10,0) и count
(2), были сплющенные в то же значение, потому что они не были разделены вкладки в файле.
db/schema.rb
:
ActiveRecord::Schema.define(version: 20160601205154) do
create_table "purchases", force: :cascade do |t|
t.string "purchaser_name"
t.string "item_description"
t.string "price"
t.string "count"
t.string "merchant_address"
t.string "merchant_name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
end
Я изначально был price
как десятичный тип данных и count
как Integer, но переключился их обратно в строку, чтобы попытаться найти решение. Я могу изменить их обратно, если это поможет (и предпочтет их поменять, если это возможно)
Точно, что мне нужно, спасибо вам большое – alisontague