使用Rails 4中的Roo从流中读取CSV文件

时间:2014-06-12 05:58:11

标签: csv ruby-on-rails-4 amazon-s3

我在这里有另一个问题Open a CSV file from S3 using Roo on Heroku,但我没有得到任何叮咬 - 所以改写:

我在S3存储桶中有一个CSV文件 我想在基于Heroku的应用程序中使用Roo读取它(即没有本地文件访问) 如何从流中打开CSV文件?

或者有更好的工具吗?

我正在使用Rails 4,Ruby 2.注意如果我从表单发布它,我可以成功打开CSV进行阅读。如何调整此操作以从S3存储桶中捕获文件?

2 个答案:

答案 0 :(得分:1)

简短回答 - 不要使用Roo。

我最终使用标准的CSV命令,使用小型CSV文件,您可以使用以下内容将文件内容简单地读入内存:

body = file.read
CSV.parse(body, col_sep: ",", headers: true) do |row|
    row_hash = row.to_hash
    field = row_hash["FieldName"]

读取从表单传入的文件,只需引用参数:

file = params[:file]
body = file.read

要阅读表单S3,您可以使用AWS gem:

s3 = AWS::S3.new(access_key_id: ENV['AWS_ACCESS_KEY_ID'], secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'])
bucket = s3.buckets['BUCKET_NAME']
# check each object in the bucket
bucket.objects.each do |obj|
    import_file = obj.key
    body = obj.read
    # call the same style import code as above...
end

答案 1 :(得分:0)

我基于此将一些代码放在一起:

Make Remote Files Local With Ruby Tempfile

和Roo似乎在传递临时文件时工作正常。我无法直接使用S3。我不是特别喜欢复制方法,但我的处理是在延迟工作时运行的,我想保持Roo功能比我不喜欢文件副本。普通的CSV文件可以在不删除编码信息的情况下工作,但XLS文件不会。