我编写了一些方法来处理rails应用程序的CSV::Table
个对象。它使用CSV.read(file_path)
方法读取文件。但是,应用程序逻辑已经改变,它不再是从本地文件读取,而是从URL读取。
我可以使用open-uri
gem open
方法加载CSV文件;但它会创建一个StringIO
对象,可以将其解析为行数组,但我无法将其转换为CSV::Table
对象。
如何从URL读取CSV文件并将其转换为CSV::Table
对象 - 以便保留现有方法?
我正在考虑覆盖CSV.open
方法使用的现有CSV.read
方法,但我不确定这样做有多安全。有什么建议吗?
答案 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