以CSV :: Table格式URL打开CSV文件

时间:2013-03-13 13:15:31

标签: ruby-on-rails ruby

我编写了一些方法来处理rails应用程序的CSV::Table个对象。它使用CSV.read(file_path)方法读取文件。但是,应用程序逻辑已经改变,它不再是从本地文件读取,而是从URL读取。

我可以使用open-uri gem open方法加载CSV文件;但它会创建一个StringIO对象,可以将其解析为行数组,但我无法将其转换为CSV::Table对象。

如何从URL读取CSV文件并将其转换为CSV::Table对象 - 以便保留现有方法?

我正在考虑覆盖CSV.open方法使用的现有CSV.read方法,但我不确定这样做有多安全。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

以下函数使用open-uri获取文件内容并将其转换为CSV::Table对象:

require 'csv'
require 'open-uri'

def read_url
  # Get StringIO from URL using open-uri
  stringio = open(file_url)

  # Create a new CSV object from StringIO
  csvobj = CSV.new(stringio)

  # Create an array of rows from CSV object
  array_of_rows = csvobj.read

  # Separate header from values
  header = array_of_rows[0]
  aux = array_of_rows.length - 1
  values = array_of_rows[1..aux]

  # Create array of CSV::Row objects
  values_row = values.map { |row| CSV::Row.new(header, row) }

  # Create a CSV::Table object from array of CSV::Row
  CSV::Table.new(values_row)
end

答案 1 :(得分:0)

CSV.new(stringio)应该这样做(详见doc

编辑:未经测试。如果这不起作用,请尝试CSV.generate