2012-04-19 103 views
0

我試圖用FasterCSV導入一個製表符分隔的文件。我嘗試了各種各樣的東西,並得到各種錯誤。在它的當前狀態,我得到一個「未定義的方法`tempfile'」錯誤。使用FasterCSV/Rails 3.1/Ruby導入1.8.7

我已經將更快的CSV代碼添加到我的創建操作中,因爲批量導入是將數據添加到此模型的唯一方法。

這是我的代碼。任何人都可以幫忙嗎?任何援助將非常感謝!

我的模型:

class AppleSale < ActiveRecord::Base 
end 

我的控制器:

require 'fastercsv' 
require 'tempfile' 

class AppleSalesController < ApplicationController 

    def new 
    @apple_sale = AppleSale.new 
    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render :json => @apple_sale } 
    end 
    end 

def create 
    file = params[:tsv_file] 
    FasterCSV.new(file.tempfile, {:headers => true, :quote_char=>'"', :col_sep =>"\t"}) do |row_data| 

     new_record = AppleSale.first_or_new(
      'provider' => row_data['provider'], 
      'provider_country' => row_data['provider_country'], 
      'vendor_identifier' => row_data['vendor_identifier'], 
      'upc' => row_data['upc'], 
      'isrc' => row_data['isrc'], 
      'artist_show' => row_data['artist_show'], 
      'title' => row_data['title'], 
      'label_studio_network' => row_data['label_studio_network'], 
      'product_type_identifier' => row_data['product_type_identifier'], 
      'units' => row_data['units'], 
      'royalty_price' => row_data['royalty_price'],      
      'download_date' => row_data['download_date'], 
      'order_id' => row_data['order_id'], 
      'postal_code' => row_data['postal_code'], 
      'customer_identifier' => row_data['customer_identifier'], 
      'report_date' => row_data['report_date'], 
      'sale_return' => row_data['sale_return'], 
      'customer_currency' => row_data['customer_currency'], 
      'country_code' => row_data['country_code'], 
      'royalty_currency' => row_data['royalty_currency'], 
      'preorder' => row_data['preorder'], 
      'isan' => row_data['isan'], 
      'customer_price' => row_data['customer_price'], 
      'apple_identifier' => row_data['apple_identifier'], 
      'cma' => row_data['cma'], 
      'asset_content_flavor' => row_data['asset_content_flavor'], 
      'vendor_order_code' => row_data['vendor_order_code'], 
      'grid' => row_data['grid'], 
      'promo_code' => row_data['promo_code'], 
      'parent_identifier' => row_data['parent_identifier'], 
      'apple_identifier' => row_data['apple_identifier']     
     ) 
     new_record.save 
    end 
    end 
end 

我的表單視圖:

<%= form_for(@apple_sale, :multipart => true) do |f| -%> 
<%= f.file_field :tsv_file %> 
<%= f.submit "Upload >>", :class => "submit" %> 
<% end %> 

我的Gemfile包含:

gem 'fastercsv' 

在此先感謝!

更新其他可能需要這個,我還不能回答我的問題:

這是所有控制器,已改變爲如下。這似乎是完美的。

def create 
    uploaded_io = params[:apple_sale][:tsv_file] 
    File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'w') do |file| 
    file.write(uploaded_io.read) 
    end 

    FasterCSV.foreach(uploaded_io.original_filename, {:headers => true, :col_sep =>"\t"}) do |row_data| 

     new_record = AppleSale.new(
      'provider' => row_data[0], 
      'provider_country' => row_data[1], 
      'vendor_identifier' => row_data[2], 
      'upc' => row_data[3], 
      'isrc' => row_data[4], 
      'artist_show' => row_data[5], 
      'title' => row_data[6], 
      'label_studio_network' => row_data[7], 
      'product_type_identifier' => row_data[8], 
      'units' => row_data[9], 
      'royalty_price' => row_data[10],      
      'download_date' => row_data[11], 
      'order_id' => row_data[12], 
      'postal_code' => row_data[13], 
      'customer_identifier' => row_data[14], 
      'report_date' => row_data[15], 
      'sale_return' => row_data[16], 
      'customer_currency' => row_data[17], 
      'country_code' => row_data[18], 
      'royalty_currency' => row_data[19], 
      'preorder' => row_data[20], 
      'isan' => row_data[21], 
      'customer_price' => row_data[22], 
      'apple_identifier' => row_data[23], 
      'cma' => row_data[24], 
      'asset_content_flavor' => row_data[25], 
      'vendor_order_code' => row_data[26], 
      'grid' => row_data[27], 
      'promo_code' => row_data[28], 
      'parent_identifier' => row_data[29] 

     ) 
     new_record.save 
    end 

     respond_to do |format| 
      format.html { redirect_to apple_sales_path, :notice => "Successfully imported sales." } 
     end 

    end 
+0

另外,請隨時提出來這是一個更好的方法如果你知道一個。 – Raoot 2012-04-19 09:20:11

回答

0

:我不認爲FasterCSV接受與new塊。

:根據Rails的3.1文檔 - 當你實現一個文件上傳表單:
http://guides.rubyonrails.org/form_helpers.html#uploading-files

那麼得到paramIO對象,這是不一定是一個純文本文件

看着它看起來像parse的FasterCSV源接受一個IO對象+塊, 所以我覺得這樣的事情應該這樣做:

FasterCSV.parse(file, ...) do |row_data| 
    ... 
end 
+0

我認爲你對第1點是正確的。我已經將它改爲在TSV文件中進行foreach和硬編碼,似乎有一半工作....它插入數據,但只插入前三個字段,並在1000行處切斷。我試過你的建議,但控制器似乎無法找到形式中使用的文件.....我應該將它上傳到某個地方,然後再傳遞給fastercsv?如果可以,我寧願不必這樣做。 – Raoot 2012-04-19 11:49:33

+0

@RyanBerry看看我發佈給RoR指南的鏈接。它解釋瞭如何做到這一點。你也應該使用rails logger來調試你的應用程序,以便知道發生了什麼:http://guides.rubyonrails.org/debugging_rails_applications.html。 – Casper 2012-04-19 11:56:36