1

我已经编写CSV::Table了为 Rails 应用程序操作对象的方法。CSV.read(file_path)它使用方法读取文件。但是,应用程序逻辑发生了变化,它不再从本地文件读取,而是从 URL 读取。

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

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

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

4

2 回答 2

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
于 2013-03-13T16:17:04.637 回答
0

CSV.new(stringio)应该做的伎俩(有关详细信息,请参阅文档

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

于 2013-03-13T13:21:04.807 回答