2013-03-13 108 views
1

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

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

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

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

回答

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 
0

CSV.new(stringio)应该做的伎俩(见doc了解详细信息)

编辑:未经测试。如果还是不行,请尝试CSV.generate

+0

事实上,它创建一个从'StringIO'对象'CSV'对象。但是,它不是'CSV :: Table'对象,它有自己的方法,例如'by_col','by_row'等。 – 2013-03-13 13:23:29

+0

'CSV.generate'用于创建CSV文件。你的建议是使用该方法创建一个临时文件,并通过我最初使用的命令('CSV.read')加载它?这可能有效,但似乎是压倒性的。我已经有一个带有CSV内容的'StringIO';我需要找到一种方法将其转换为'CSV :: Table'对象。 – 2013-03-13 13:34:29

+0

什么是CSV :: Table.new(CSV.new(stringio).read())? – leifg 2013-03-13 13:44:07