parsley/lib/usda_importer.rb
2016-01-24 17:10:43 -06:00

118 lines
2.1 KiB
Ruby

require 'csv'
class UsdaImporter
COLUMNS = [
'NDB_No',
'Shrt_Desc',
'Water',
'Energ_Kcal',
'Protein',
'Lipid_Tot',
'Ash',
'Carbohydrt',
'Fiber_TD',
'Sugar_Tot',
'Calcium',
'Iron',
'Magnesium',
'Phosphorus',
'Potassium',
'Sodium',
'Zinc',
'Copper',
'Manganese',
'Selenium',
'Vit_C',
'Thiamin',
'Riboflavin',
'Niacin',
'Panto_acid',
'Vit_B6',
'Folate_Tot',
'Folic_acid',
'Food_Folate',
'Folate_DFE',
'Choline_Tot',
'Vit_B12',
'Vit_A_IU',
'Vit_A_RAE',
'Retinol',
'Alpha_Carot',
'Beta_Carot',
'Beta_Crypt',
'Lycopene',
'Lut+Zea',
'Vit_E',
'Vit_D_mcg',
'Vit_D_IU',
'Vit_K',
'FA_Sat',
'FA_Mono',
'FA_Poly',
'Cholestrl',
'GmWt_1',
'GmWt_Desc1',
'GmWt_2',
'GmWt_Desc2',
'Refuse_Pct'
]
COLUMN_MAP = {
ndbn: 'NDB_No',
short_description: 'Shrt_Desc',
water: 'Water',
kcal: 'Energ_Kcal',
protein: 'Protein',
lipid: 'Lipid_Tot',
ash: 'Ash',
carbohydrates: 'Carbohydrt',
fiber: 'Fiber_TD',
sugar: 'Sugar_Tot',
gram_weight_1: 'GmWt_1',
gram_weight_2: 'GmWt_2',
gram_weight_desc_1: 'GmWt_Desc1',
gram_weight_desc_2: 'GmWt_Desc2',
refuse_percent: 'Refuse_Pct'
}
def initialize(file)
@file = file
end
def import
UsdaFood.delete_all
CSV.open(@file, 'r:iso-8859-1:utf-8', csv_options) do |csv|
csv.each_slice(500) do |slice|
UsdaFood.transaction do
attributes = slice.map do |row|
Hash[COLUMN_MAP.map { |db, col| [db, row[col]] }]
end
UsdaFood.create(attributes)
end
end
end
usda_items = Hash[UsdaFood.where(ndbn: Ingredient.select(:ndbn)).map { |uf| [uf.ndbn, uf] }]
Ingredient.where('ndbn IS NOT NULL').each do |i|
item = usda_items[i.ndbn]
if item
i.set_usda_food(item)
i.save
end
end
end
def csv_options
{ col_sep: '^', quote_char: '~', headers: COLUMNS }
end
end