2012-08-04 26 views
0

我想解析遠程CSV文件的前5行。然而,當我這樣做,它會引發Errno::ENOENT異常,並說:用FasterCSV解析遠程文件

No such file or directory - [file contents](含[文件內容]是的CSV內容的轉儲

這裏是我的代碼:

def preview 
    @csv = [] 
    open('http://example.com/spreadsheet.csv') do |file| 
     CSV.foreach(file.read, :headers => true) do |row| 
     n += 1 
     @csv << row 
     if n == 5 
      return @csv 
     end 
     end 
    end 
    end 

上面的代碼從我看到其他人使用堆棧溢出,但我不能得到它的工作。

如果我從該文件中刪除read方法,它會引起一個TypeError異常,說:

can't convert StringIO into String 

有什麼我失蹤了嗎?

+0

也許我沒有意識到這一點,但據我所知,FasterCSV不能下載在運行該文件,並對其進行分析 - 首先將它保存到你的硬盤驅動器 – 2012-08-04 04:40:21

回答

0

Foreach需要一個文件名。嘗試parse.each

+0

謝謝 - 雖然當我嘗試foreach(這似乎更優雅,因爲我想要加載文件),我得到以下錯誤:'沒有這樣的文件或目錄 - http:// example.com/spreadsheet.csv'有沒有更好的方法來寫這個? – Asherlc 2012-08-04 04:00:18

+0

您可以首先將url保存爲文件。 – pguardiario 2012-08-04 04:20:54

+0

我意識到這是越來越少的話題,但我使用載波來保存這些文件在S3中。傳入載波對象也不起作用 - 我應該採取不同的方式嗎?使用heroku,所以我不能將文件下載到我的服務器。 – Asherlc 2012-08-04 17:21:32

0

你可以每行手動傳遞到CSV解析:

require 'open-uri' 
require 'csv' 

def preview(file_url) 
    @csv = [] 
    open(file_url).each_with_index do |line, i| 
     next if i == 0 #Ignore headers 
     @csv << CSV.parse(line) 
     if i == 5 
      return @csv 
     end 
    end 
end 

puts preview('http://www.ferc.gov/docs-filing/eqr/soft-tools/sample-csv/contract.txt')