2012-11-25 61 views
2

我有這樣的解析一個CSV文件:CSV導入問題

csv_file = CSV.parse(
    file.read(), 
    headers:    true, 
    header_converters: :symbol 
) 

它的工作原理,但我想指定的編碼類型,所以我補充一下:{encoding: 'UTF-8'}到如下讀取方法:

csv_file = CSV.parse(
    file.read({encoding: 'UTF-8'}), 
    headers:    true, 
    header_converters: :symbol 
) 

但我得到這個錯誤:不能將哈希轉換爲整數

我只是不能看到什麼是錯的。我已經檢查了文檔,但是它說你可以像這樣傳遞編碼,但它確實需要文件作爲第一個參數,所以它可能會在那裏停滯,但是肯定是因爲它已經知道什麼文件正在讀取它應該沒問題。

我該如何解決這個問題?

更新:

我已經更新到以下幾點:

def import 
    if params[:import_coasters] 
    file = params[:import_coasters][:file] 
    Park.import_from_csv(file) 


def self.import_from_csv(file) 
    Park.destroy_all 

csv_file = CSV.parse(
    File.read(file, {encoding: 'UTF-8'}), 
    headers:    true, 
    header_converters: :symbol 
) 

,但我得到了以下錯誤:

不能轉換ActionDispatch :: Http :: UploadedFile轉換爲字符串

+0

你是如何創建文件變量?爲了測試它,我無法重新創建您的問題。 – joofsh

+0

你能指點那些說你可以用這種方式#read的文檔嗎 –

回答

4

你很近。試試這個:

# Step 1: convert the uploaded file object to a file name 
uploaded_file = params[:import_coasters][:file] 
file_name = uploaded_file.path 

# Step 2: To get the input text and see if it's what you expect 
text = File.read(
    file_name, 
    {encoding: 'UTF-8'} 
) 

# Parse the text 
csv_file = CSV.parse(
    text, 
    headers: true, 
    header_converters: :symbol 
) 

從上IO.read了Ruby 1.9.3文檔:

「如果最後一個參數是一個哈希,它規定了內部開放選項()的關鍵將是以下open_args:是別人專有的。「

http://www.ruby-doc.org/core-1.9.3/IO.html#method-c-read

而且,看文檔UploadedFile,因爲它實際上不是一個典型的Ruby文件對象:

http://api.rubyonrails.org/classes/ActionDispatch/Http/UploadedFile.html

+0

查看我的原始問題以獲得更新。 – rctneil

+0

有關於此的任何想法?我似乎無法弄清楚。 – rctneil

+0

您的更新是一個完全不同的問題 - 這不是真正的CSV解析。您正在將文件輸入參數與文件名混合在一起。要看到這一點,請多做一步,並展示每一步的輸出結果:文件參數是什麼類?如果它是一個字符串,它是一個有效的文件名?如果是這樣,你能打開文件閱讀嗎?如果是這樣,文本編碼的工作是否正確? – joelparkerhenderson

1

這是因爲File.read()期待一個文件名作爲第論據。您正在傳遞ActionDispatch :: Http :: UploadedFile。如果你看一下documentation,你會看到UploadedFile的已經有一個讀方法,所以你可以嘗試:

csv_file = CSV.parse(
    file.read({encoding: 'UTF-8'}), 
    headers:    true, 
    header_converters: :symbol 
)