CSV导入问题

时间:2012-11-25 00:14:31

标签: ruby-on-rails ruby csv import

我有这个解析CSV文件:

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

它有效,但我想指定编码类型,所以我在read方法中添加:{encoding: 'UTF-8'},如下所示:

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

但我收到此错误:无法将Hash转换为整数

我只是看不出有什么问题。我已经检查了文档,但它说你可以像这样传递编码,但它确实需要将文件作为第一个参数,因此它可能会停在那里但当然它已经知道什么文件正在读取它应该没问题。

我该如何解决这个问题?

更新

我已更新到以下内容:

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转换为String

2 个答案:

答案 0 :(得分: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()的选项。键将是以下内容.open_args:对其他人是独占的。”

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

另外,请查看UploadedFile的文档,因为它实际上不是典型的Ruby File对象:

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

答案 1 :(得分:1)

这是因为File.read()期望文件名作为第一个参数。您正在传递ActionDispatch :: Http :: UploadedFile。如果您查看documentation,您会发现UploadedFile已经有了read方法,因此您可以尝试:

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