2013-03-13 77 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