【问题标题】:CSV Import issueCSV 导入问题
【发布时间】:2012-11-12 21:03:20
【问题描述】:

我有这个来解析 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 转换为字符串

【问题讨论】:

  • 你是如何创建文件变量的?我无法重现您的问题以进行测试。
  • 能否请您指出说您可以以这种方式使用#read 的文档

标签: ruby-on-rails ruby csv import


【解决方案1】:

你已经接近了。试试这个:

# 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

【讨论】:

  • 对此有什么想法吗?实在想不通。
  • 您的更新是一个完全不同的问题——这实际上与 CSV 解析无关。您将文件输入参数与文件名混合在一起。要看到这一点,请逐步执行并显示每个步骤的输出:您的文件参数是什么类?如果它是一个字符串,它是一个有效的文件名吗?如果是这样,您可以打开文件进行阅读吗?如果是这样,文本编码是否正确?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2014-10-17
    • 2011-09-08
    • 2014-03-22
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多